/*
默认情况 channel 发送和接收数据时阻塞的
然而我们可以使用select的default的选项来实现无阻塞发送和接收数据
甚至可以将多个select的case选项和default选项结合起来使用
*/
package main
import (
"fmt"
)
func main() {
/*
知识点 := 快速赋值
make
chan string
chan bool
*/
messages := make(chan string, 1)
signals := make(chan bool)
/*
这里是一个非阻塞的从通道接收数据 如果messages通道有数据
可以接收 那么select将运行 <-messages这个case 否则的话
程序立刻执行default选项后面的语句
*/
/*
知识点: select{
case :
default:
}
如果case阻塞 则执行default
msg := <-messages 管道读取
*/
select {
case msg := <-messages:
fmt.Println("received message", msg)
default:
fmt.Println("no message received")
}
//非阻塞通道发送数据也是一样的
msg := "hi"
select {
case messages <- msg:
fmt.Println("sent message", msg)
default:
fmt.Println("no message sent")
}
/*
在default前面 我们可以有多个case选项 从而实现多通道
非阻塞的选择 这里我们尝试从messages和signals接收数据
如果有数据可以接收 那么执行对应case后面的逻辑
否则立刻执行default选项后面的逻辑
*/
select {
case msg := <-messages:
fmt.Println("received message", msg)
case sig := <-signals:
fmt.Println("received signal", sig)
default:
fmt.Println("no activity")
}
/*
在这个例子中 使用了default来实现非阻塞的通道
*/
}