go - 如何测试 channel 是否关闭并且仅在未关闭时发送给它

标签 go channel

在 Go 中,如果 channel channel 已关闭,我仍然可以使用以下语法从中读取,并且可以测试 ok 以查看它是否已关闭。

value, ok := <- channel
if !ok {
    // channel was closed and drained
}

但是,如果我不知道某个 channel 是否已关闭而盲目地写入它,我可能会收到错误消息。我想知道是否有任何方法可以测试 channel 并仅在 channel 未关闭时写入。我问这个问题是因为有时我不知道一个通​​道是否在 goroutine 中关闭。

最佳答案

你不能。这里的经验法则是只有作家才应该关闭 channel ,这样你就知道你不应该再向那个 channel 写信了。

一些简单的代码如下所示:

for i := 0; i < 100; i++ {
    value := calculateSomeValue()
    channel <- value
}

close(channel) //indicate that we will no more send values

关于go - 如何测试 channel 是否关闭并且仅在未关闭时发送给它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39213230/

相关文章:

go - 确保在启动第三个命令之前运行两个命令

go - 为什么与 == 相比,具有相同日期和时间的 2 个时间结构返回 false?

go - 我应该为下游服务调用创建一个新上下文还是只是简单地传递上游服务调用?

Golang - Go 例程和 channel 有一些问题

multithreading - 我怎样才能拥有一个等待来自多个其他人的值的 goroutine 函数?

转到函数调用的类型

Qthread 在 Golang 中只发出一个信号

go - Channel中的一个数据被两个routine接收

go - 如果通过 Golang channel 发送,结构实际上是否在 goroutine 之间复制?

rust - 如何在没有不稳定功能或外部包装箱的情况下从 mpsc::channel 读取指定的时间?