猿问

如何测试通道是否关闭并且仅在未关闭时发送给它

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


value, ok := <- channel

if !ok {

    // channel was closed and drained

}

但是,如果我不知道某个通道是否已关闭而盲目地对其进行写入,则可能会出错。我想知道是否有任何方法可以测试通道并仅在通道未关闭时写入。我问这个问题是因为有时我不知道一个通道是否在一个 goroutine 中关闭。


摇曳的蔷薇
浏览 163回答 2
2回答

慕的地10843

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

守着星空守着你

如果很少有 goroutin 写入通道,您也可以使用nil它来代替读写。像这样的东西closeselectch := make(chan int, 1)var value intch <- 5select {case value = <-ch:&nbsp; &nbsp; fmt.Println("value", value)default:&nbsp; &nbsp; fmt.Println("oops")}ch = nilselect {case ch <- 5:default:&nbsp; &nbsp; fmt.Println("don't panic")}select {case value = <-ch:&nbsp; &nbsp; fmt.Println("value", value)default:&nbsp; &nbsp; fmt.Println("oops")}试试看https://play.golang.org/p/sp8jk961TB
随时随地看视频慕课网APP

相关分类

Python
我要回答