猿问
回到首页
个人中心
反馈问题
注册登录
下载APP
首页
课程
实战
体系课
手记
专栏
慕课教程
使用Go检查通道是否具有可读取的值
如何检查频道是否具有我可以读取的值?
在阅读频道时,我不想阻塞。我想看看它是否有价值。如果确实有一个,我会读的。如果还没有,我会做点其他的事,稍后再回来查看。
慕尼黑的夜晚无繁华
浏览 524
回答 3
3回答
人到中年有点甜
我知道要从通道读取的唯一非阻塞操作是在具有默认情况的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。该规范已被修改。请在此处尝试阻止(死锁)
0
0
0
繁华开满天机
您不需要,至少对于同步(无缓冲)通道没有。在不要求从通道中获取值的情况下,无法判断一个值是否正在等待。对于缓冲通道,从技术上讲,您可以使用len函数执行您所描述的操作,但实际上,实际上不应该这样做。您的技术无效。原因是它代表比赛条件。给定通道ch,您的goroutine可能会看到len(ch)> 0并得出结论,有一个值在等待。但是,不能得出结论,它可以无阻塞地从通道读取数据-另一个goroutine可能会在您检查len到运行接收操作之间清空该通道。出于您描述的目的,请使用带有默认案例的select(如Ripounet所示)。
0
0
0
打开App,查看更多内容
随时随地看视频
慕课网APP
相关分类
Go
继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续