029_go语言中的非阻塞通道
代码演示
package main
import "fmt"
func main() {
messages := make(chan string)
signals := make(chan bool)
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")
}
select {
case msg := <-messages:
fmt.Println("received message", msg)
case sig := <-signals:
fmt.Println("received signal", sig)
default:
fmt.Println("no activity")
}
}
代码运行结果
no message received no message sent no activity
代码解读
select中的每个case必须是一个通信操作,要么是发送要么是接收。select随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。
常规的通过通道发送和接收数据都是阻塞的,但是可以通过带default的select实现非阻塞的发送和接收数据
以上例子通过三个select来演示非阻塞的接收,发送,和多路选择
第一个select是非阻塞接收的例子,由于通道messages中没有值存在,所以select会到default中执行
第二个select是非阻塞发送的例子,这里要注意,由于通道messages在发送前,是一个nil通道,所以case也不会执行
第三个select是一个多路选择的例子

浙公网安备 33010602011771号