在 Go 中,如果通道channel关闭,我仍然可以使用以下语法从中读取,并且可以测试ok它是否已关闭。value, ok := <- channelif !ok { // channel was closed and drained}但是,如果我不知道某个通道是否已关闭而盲目地对其进行写入,则可能会出错。我想知道是否有任何方法可以测试通道并仅在通道未关闭时写入。我问这个问题是因为有时我不知道一个通道是否在一个 goroutine 中关闭。
2 回答

慕的地10843
TA贡献1785条经验 获得超8个赞
你不能。这里的经验法则是只有作家才能关闭频道,这样你就知道你不应该再写信给那个频道了。
一些简单的代码如下所示:
for i := 0; i < 100; i++ {
value := calculateSomeValue()
channel <- value
}
close(channel) //indicate that we will no more send values

守着星空守着你
TA贡献1799条经验 获得超8个赞
如果很少有 goroutin 写入通道,您也可以使用nil它来代替读写。像这样的东西closeselect
ch := make(chan int, 1)
var value int
ch <- 5
select {
case value = <-ch:
fmt.Println("value", value)
default:
fmt.Println("oops")
}
ch = nil
select {
case ch <- 5:
default:
fmt.Println("don't panic")
}
select {
case value = <-ch:
fmt.Println("value", value)
default:
fmt.Println("oops")
}
试试看https://play.golang.org/p/sp8jk961TB
添加回答
举报
0/150
提交
取消