通道上的基本发送和接收是阻塞的。但是,我们可以使用带有default 子句的select 来实现非阻塞发送、接收,甚至非阻塞的多路select 。
|
|
|
package main
|
|
import "fmt"
|
|
func main() {
messages := make(chan string)
signals := make(chan bool)
|
这是一个非阻塞接收。如果messages 上有值可用,则select 将使用该值接受<-messages case 。如果没有,它将立即接受default case。
|
select {
case msg := <-messages:
fmt.Println("received message", msg)
default:
fmt.Println("no message received")
}
|
非阻塞发送的工作原理类似。这里msg 无法发送到messages 通道,因为通道没有缓冲区,也没有接收器。因此,选择了default case。
|
msg := "hi"
select {
case messages <- msg:
fmt.Println("sent message", msg)
default:
fmt.Println("no message sent")
}
|
我们可以在default 子句之上的多个case 中使用,以实现多路非阻塞选择。这里我们尝试在messages 和signals 上进行非阻塞接收。
|
select {
case msg := <-messages:
fmt.Println("received message", msg)
case sig := <-signals:
fmt.Println("received signal", sig)
default:
fmt.Println("no activity")
}
}
|