我有一个go例程,定期轮询每个间隔并执行操作。它还检查完成的通道,作为结束信号,以停止轮询。
go func(){
for {
select{
case <-myticker.C:
do_something()
case <-done:
fmt.Println("I am done")
return
}
}
}
我意识到如果我关闭频道,它也会像传递给完成频道的那样运行,它打印出“我已经完成”为什么会这样?
答案 0 :(得分:5)
来自规范:
封闭频道上的接收操作始终可以继续 立即,在任何之后产生元素类型的零值 已收到先前发送的值。
答案 1 :(得分:4)
因为没有返回值就无法完成。所以它必须返回一些“存根”,根据规范零值选择。 您也可以使用双值表单来检查是否返回了实际值或存根。
val, ok := <- someChannel
if ok {
// value was got from the channel
}
if !ok {
// channel was closed
}