先说个结论:Go语言并没有「检查channel是否关闭,但又不造成其他影响」的功能。
Go并发编程的基本原则:对于任何channel,任何时候只有一个goroutine是这个channel的owner。而只有owner才有权对这个协程做出写操作(写操作有两种,分别是将元素投递到channel,以及关闭channel)。
既然只有一个协程负责投递或者close,那么这个协程自然知道有没有做过close操作了。
当然如果不是owner的话,就需要一次读操作,但这样的话可能会将里面的东西读出来。下面是读操作的一个例子。
select { case _, ok := <- ch: if ok { } else { } case <-time.After(time.Millisecond): }