乐趣区

关于go:Go-快速入门指南-关闭通道

概述

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

应用规定

通过关键字 clsoe 敞开通道。

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

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

例子

敞开一个空的通道

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

分割我

退出移动版