golang现在是没有提供单纯检查一个chan是否关闭的方法的。

通过读chan时的第二个返回值可以知道,但仅适用于接收端; 通过recover的方式可以勉强实现,但是不推荐;还可以通过cgo的方式判断chan内部的closed指针,但这个也比较另类。

chan的close操作一般用来通知事件,表示已经没有数据可以发送了,这只出现在有单个发送者的情况,且close操作由发送者来做。

如果存在多个发送者,是不应该采用close来通知的。此时如果接受者仅有一个,则可以增加一个信号chan,由接收者关闭, 通知发送者不要再发送。

如果接受者有多个, 则应该在一个互斥方法里获取chan引用, 以状态变量来表示chan的关闭状态, 且关闭一个信号chan来通知所有接收者。

如果以锁和状态变量来保护一个chan是否close的话, 则检查操作和发送接收操作都要放到锁代码段里,会影响效率。