关闭一个 channel 的方式:
close(ch)
如果向一个已经关闭的 channel 发送数据,会导致 panic。这意味着,只有发送数据的一方应该控制 channel 的关闭(接收的一方不应该关闭 channel,因为并不知道对方还要不要发送)。
没有不消费 channel 便知道它是否被关闭的方式。
对于一个关闭的 channel:
v := <- ch // v 为 nil
v, ok := <-ch // v 为 nil,ok 为 false
for v := range ch {
fmt.Println(v) // 这行永远不会被执行
}
select
语句中有一个 case
是从一个关闭的 channel 中接收消息时,该 case
总是 ready 的:
func main() {
ch := make(chan struct{})
close(ch)
select {
case <-ch:
fmt.Println("closed")
default:
fmt.Println("default")
}
select {
case <-ch:
fmt.Println("closed")
default:
fmt.Println("default")
}
}
上述代码输出两次 "closed"。