【问题标题】:Non-blocking channel operations in go. Send?go中的非阻塞通道操作。发送?
【发布时间】:2017-04-21 09:00:29
【问题描述】:

我正在通过Go by Example: Non-Blocking Channel Operations

据我了解,第一个select 触发了default 案例,因为messages 频道中没有任何内容,如果default 案例不存在,我们将收到@987654326 @错误,对吧?

好吧,我不知道如何触发第二个select,特别是触发case messages <- msg:

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

【问题讨论】:

    标签: go channel


    【解决方案1】:

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

    因为通道是无缓冲的,并且在接收时没有其他 goroutine 阻塞。

    如何触发案例消息

    您可以:

    1. 使messages缓冲

      messages := make(chan string, 1)
      

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

    2. 创建另一个在接收时被阻止的 goroutine

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2020-11-22
    • 2015-12-08
    • 2015-03-30
    • 2017-12-08
    • 2012-09-15
    • 2014-08-25
    相关资源
    最近更新 更多