概述
倡议先浏览 阻塞通道 和 非阻塞通道 大节。
在后面的两个大节中,为了最小化代码达到演示成果,省略了 敞开通道
的步骤,
正确的做法应该是在通道应用实现后敞开。
应用规定
通过关键字 clsoe
敞开通道。
- 敞开一个空的通道 (值为 nil) 时,panic
- 敞开一个非空 && 已敞开的通道时,panic
- 敞开一个非空 && 未敞开的通道时,失常敞开
这里的规定不用死记硬背,笔者遇到的大多数状况属于第二种,也就是 反复敞开一个通道
,
读者做到理论开发中遇到 敞开通道
的场景时,分割上下文, 确认通道不会呈现反复敞开的状况 即可。
例子
敞开一个空的通道
package main
func main() {
var ch chan bool
close(ch)
}
// $ go run main.go
// 输入如下
/**
panic: close of nil channel
...
...
exit status 2
*/
敞开一个非空 && 已敞开通道
package main
func main() {ch := make(chan bool)
close(ch)
close(ch) // 反复敞开
}
// $ go run main.go
// 输入如下
/**
panic: close of nil channel
...
...
exit status 2
*/
敞开一个非空 && 未敞开的通道
package main
func main() {ch := make(chan bool)
close(ch)
println("channel closed")
}
// $ go run main.go
// 输入如下
/**
channel closed
*/