乐趣区

关于go:Go-快速入门指南-检测通道是否关闭

概述

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

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

例子

双向通道检测

package main

func main() {ch := make(chan string)
    close(ch)

    if _, open := <-ch; !open {println("channel closed")
    }
}

// $ go run main.go
// 输入如下
/**
  channel closed
*/

单向 (只读) 通道检测

package main

import "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 main

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

分割我

退出移动版