概述

倡议先浏览 阻塞通道 和 非阻塞通道 大节。
在后面的两个大节中, 为了最小化代码达到演示成果,省略了 敞开通道 的步骤,
正确的做法应该是在通道应用实现后敞开。

应用规定

通过关键字 clsoe 敞开通道。

  1. 敞开一个空的通道 (值为 nil) 时,panic
  2. 敞开一个非空 && 已敞开的通道时,panic
  3. 敞开一个非空 && 未敞开的通道时,失常敞开

这里的规定不用死记硬背,笔者遇到的大多数状况属于第二种,也就是 反复敞开一个通道
读者做到理论开发中遇到 敞开通道 的场景时,分割上下文,确认通道不会呈现反复敞开的状况即可。

例子

敞开一个空的通道

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*/

分割我