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

使用Go检查通道是否具有可读取的值

使用Go检查通道是否具有可读取的值

Go
慕尼黑的夜晚无繁华 2021-04-06 13:15:26
如何检查频道是否具有我可以读取的值?在阅读频道时,我不想阻塞。我想看看它是否有价值。如果确实有一个,我会读的。如果还没有,我会做点其他的事,稍后再回来查看。
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

我知道要从通道读取的唯一非阻塞操作是在具有默认情况的select块内:


    select {

    case x, ok := <-ch:

        if ok {

            fmt.Printf("Value %d was read.\n", x)

        } else {

            fmt.Println("Channel closed!")

        }

    default:

        fmt.Println("No value ready, moving on.")

    }


备注以前的答案:接收运营商本身就是现在阻塞操作,如围棋1.0.3。该规范已被修改。请在此处尝试阻止(死锁)


查看完整回答
反对 回复 2021-04-26
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

您不需要,至少对于同步(无缓冲)通道没有。在不要求从通道中获取值的情况下,无法判断一个值是否正在等待。

对于缓冲通道,从技术上讲,您可以使用len函数执行您所描述的操作,但实际上,实际上不应该这样做。您的技术无效。

原因是它代表比赛条件。给定通道ch,您的goroutine可能会看到len(ch)> 0并得出结论,有一个值在等待。但是,不能得出结论,它可以无阻塞地从通道读取数据-另一个goroutine可能会在您检查len到运行接收操作之间清空该通道。

出于您描述的目的,请使用带有默认案例的select(如Ripounet所示)。


查看完整回答
反对 回复 2021-04-26
  • 3 回答
  • 0 关注
  • 484 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信