我正在浏览Go by Example: Non-Blocking Channel Operations
据我了解,第一个select
触发了default
个案,因为messages
频道中没有任何内容,default
案例没有&#39}存在,我们会收到fatal error: all goroutines are asleep - deadlock!
错误,对吧?
好吧,我无法弄清楚如何触发第二个select
,特别是触发case messages <- msg:
正如我所想,它应该与接收相反。因此,如果有2个消息的缓冲区并且我们将第3个消息发送到通道,它将触发default
子句,但messages
通道为空,那么为什么在第二个选择中它触发default
子句?如何触发case messages <- msg:
子句?
答案 0 :(得分:6)
为什么在第二个选择中它会触发默认子句?
因为频道是无缓冲的,并且在接收时没有其他阻止例程被阻止。
如何触发大小写消息&lt; - msg:clause?
你可以:
让messages
缓冲
messages := make(chan string, 1)
创建另一个在接收时阻止的go例程
go func() {
fmt.Println("Received from other go routine", <-messages)
}()