为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

摇曳的蔷薇 2022-03-07 15:53:08
在 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


查看完整回答
反对 回复 2022-03-07
?
守着星空守着你

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


查看完整回答
反对 回复 2022-03-07
  • 2 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号