在线文档 > Golang练习 > 非阻塞通道操作
在Go中,基本的通道发送和接收数据都是阻塞的。
但是,我们可以使用select
和default
子句来实现非阻塞发送、接收,甚至是非阻塞多路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`通道。
// 因此选择了默认情况。
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")
}
}
运行结果如下:
$ go run non-blocking-channel-operations.go
no message received
no message sent
no activity