概述

倡议先浏览 非缓冲通道, 缓冲通道, 敞开通道,
通道方向。

Go 语言没有提供函数或办法判断一个通道是否敞开。因而只能应用一个变通的方法:接管通道元素,依据返回的布尔值确定通道是否敞开。

例子

双向通道检测

package mainfunc main() {    ch := make(chan string)    close(ch)    if _, open := <-ch; !open {        println("channel closed")    }}// $ go run main.go// 输入如下/**  channel closed*/

单向 (只读) 通道检测

package mainimport "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, 这时能够利用 deferrecover 中输入起因
package mainimport "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*/

分割我