如何检查频道是否具有我可以读取的值?在阅读频道时,我不想阻塞。我想看看它是否有价值。如果确实有一个,我会读的。如果还没有,我会做点其他的事,稍后再回来查看。
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。该规范已被修改。请在此处尝试阻止(死锁)
繁华开满天机
TA贡献1816条经验 获得超4个赞
您不需要,至少对于同步(无缓冲)通道没有。在不要求从通道中获取值的情况下,无法判断一个值是否正在等待。
对于缓冲通道,从技术上讲,您可以使用len函数执行您所描述的操作,但实际上,实际上不应该这样做。您的技术无效。
原因是它代表比赛条件。给定通道ch,您的goroutine可能会看到len(ch)> 0并得出结论,有一个值在等待。但是,不能得出结论,它可以无阻塞地从通道读取数据-另一个goroutine可能会在您检查len到运行接收操作之间清空该通道。
出于您描述的目的,请使用带有默认案例的select(如Ripounet所示)。
- 3 回答
- 0 关注
- 523 浏览
添加回答
举报
0/150
提交
取消