golang channel的行为
1. 读nil的channel是永远阻塞的。关闭nil的channel会造成panic。
2. closed channel的行为:
(1)向close的channel发消息会panic,关闭一个已经关闭的channel,也会panic。所以应该由生产者关闭channel。
(2)如果close的channel还有数据,仍然可以读取。
(3)读取close的并且空的channel,会马上返回零值(注意chan int会返回0),所以可以用于广播。
(4)val,ok = <- ch, ok=false表示channel空并且close了 (注意不是“或者”)。结合(1)、(2),这里可以用于消费者。
(5)close channel可以用来广播,因为读取或者select关闭的channel,会马上返回。如果是存在多个生产者,此时不能随便关闭channel,可以通过关闭另一个channel来停止消费行为。
3. 可以对channel使用range。这样不用写select,显得代码简洁。
4. select是随机的,select越多channel消耗越多。
参考:
https://stackoverflow.com/questions/34897843/why-does-go-panic-on-writing-to-a-closed-channel