我正在通过示例:非阻塞频道操作
据我了解,第一个select
是触发default
案例,因为messages
渠道中没有任何内容,如果default
案件不存在,我们会收到fatal error: all goroutines are asleep - deadlock!
错误,对吧?
好吧,我无法弄清楚如何触发第二个select
,特别是触发 case messages <- msg:
正如我所想,它应该与接收相反.因此,如果有2个消息的缓冲区并且我们将第3个消息发送到通道,它将触发该default
子句,但是messages
通道是空的,那么为什么在第二个选择中它会触发该default
子句?我该如何触发该case messages <- msg:
条款?
为什么在第二个选择中它会触发默认子句?
因为通道是无缓冲的,并且在接收时没有其他阻止例程.
如何触发案例消息< - msg:clause?
你可以:
制作messages
缓冲
messages := make(chan string, 1)
Run Code Online (Sandbox Code Playgroud)
创建另一个在接收时被阻止的go例程
go func() {
fmt.Println("Received from other go routine", <-messages)
}()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4050 次 |
最近记录: |