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

时间:2016-12-06 16:25:13

标签: go channel

我正在浏览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:子句?

1 个答案:

答案 0 :(得分:6)

  

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

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

  

如何触发大小写消息&lt; - msg:clause?

你可以:

  1. messages缓冲

    messages := make(chan string, 1)
    

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

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

    go func() {
        fmt.Println("Received from other go routine", <-messages)
    }()
    

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