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