go中的非阻塞通道操作.发送?

Arn*_*rno 2 channel go

我正在通过示例:非阻塞频道操作

据我了解,第一个select是触发default案例,因为messages渠道中没有任何内容,如果default案件不存在,我们会收到fatal error: all goroutines are asleep - deadlock!错误,对吧?

好吧,我无法弄清楚如何触发第二个select,特别是触发 case messages <- msg:

正如我所想,它应该与接收相反.因此,如果有2个消息的缓冲区并且我们将第3个消息发送到通道,它将触发该default子句,但是messages通道是空的,那么为什么在第二个选择中它会触发该default子句?我该如何触发该case messages <- msg:条款?

Tim*_*per 6

为什么在第二个选择中它会触发默认子句?

因为通道是无缓冲的,并且在接收时没有其他阻止例程.

如何触发案例消息< - msg:clause?

你可以:

  1. 制作messages缓冲

    messages := make(chan string, 1)
    
    Run Code Online (Sandbox Code Playgroud)

    https://play.golang.org/p/b1aO6N-dYf

  2. 创建另一个在接收时被阻止的go例程

    go func() {
        fmt.Println("Received from other go routine", <-messages)
    }()
    
    Run Code Online (Sandbox Code Playgroud)

    https://play.golang.org/p/Z7e1ZcO3C5