为什么关闭通道进入常规会导致接收通道接收值?

时间:2018-03-07 02:44:38

标签: go

我有一个go例程,定期轮询每个间隔并执行操作。它还检查完成的通道,作为结束信号,以停止轮询。

  go func(){
       for {
          select{
              case <-myticker.C:
                 do_something()
              case <-done:
                 fmt.Println("I am done")
                 return
         } 
       }

    }

我意识到如果我关闭频道,它也会像传递给完成频道的那样运行,它打印出“我已经完成”为什么会这样?

2 个答案:

答案 0 :(得分:5)

来自规范:

  

封闭频道上的接收操作始终可以继续   立即,在任何之后产生元素类型的零值   已收到先前发送的值。

请参阅https://golang.org/ref/spec#Receive_operator

答案 1 :(得分:4)

因为没有返回值就无法完成。所以它必须返回一些“存根”,根据规范零值选择。 您也可以使用双值表单来检查是否返回了实际值或存根。

val, ok := <- someChannel
if ok {
   // value was got from the channel
}
if !ok {
   // channel was closed
}