概述
倡议先浏览 非缓冲通道, 缓冲通道, 敞开通道,
通道方向。
Go 语言没有提供函数或办法判断一个通道是否敞开。因而只能应用一个变通的方法:接管通道元素,依据返回的布尔值确定通道是否敞开。
例子
双向通道检测
package mainfunc main() { ch := make(chan string) close(ch) if _, open := <-ch; !open { println("channel closed") }}// $ go run main.go// 输入如下/** channel closed*/
单向 (只读) 通道检测
package mainimport "time"func main() { ch := make(chan string) go func(c <-chan string) { if _, open := <-c; !open { println("channel closed") } }(ch) close(ch) time.Sleep(time.Second)}// $ go run main.go// 输入如下/** channel closed*/
单向 (只写) 通道检测
对于只写通道,须要采纳一个折中的方法:
尝试向通道写入数据
- 如果写入胜利,阐明通道还未敞开
- 写入失败,产生
panic
, 这时能够利用defer
在recover
中输入起因
package mainimport "time"func main() { ch := make(chan string) go func(c chan<- string) { defer func() { if err := recover(); err != nil { // 捕捉到 panic println("channel closed") } }() c <- "hello world" }(ch) close(ch) time.Sleep(time.Second)}// $ go run main.go// 输入如下,你的输入可能和这里的不一样/** channel closed*/