概述
倡议先浏览 非缓冲通道, 缓冲通道, 敞开通道,
通道方向。
Go 语言没有提供函数或办法判断一个通道是否敞开 。因而只能应用一个变通的方法:接管通道元素,依据返回的布尔值确定通道是否敞开。
例子
双向通道检测
package main
func main() {ch := make(chan string)
close(ch)
if _, open := <-ch; !open {println("channel closed")
}
}
// $ go run main.go
// 输入如下
/**
channel closed
*/
单向 (只读) 通道检测
package main
import "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 main
import "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
*/