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

如何检查频道是否具有我可以读取的值?

在阅读频道时,我不想阻塞。我想看看它是否有价值。如果确实有一个,我会读的。如果还没有,我会做点其他的事,稍后再回来查看。


慕尼黑的夜晚无繁华
浏览 524回答 3
3回答

人到中年有点甜

我知道要从通道读取的唯一非阻塞操作是在具有默认情况的select块内:&nbsp; &nbsp; select {&nbsp; &nbsp; case x, ok := <-ch:&nbsp; &nbsp; &nbsp; &nbsp; if ok {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("Value %d was read.\n", x)&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Channel closed!")&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("No value ready, moving on.")&nbsp; &nbsp; }备注以前的答案:接收运营商本身就是现在阻塞操作,如围棋1.0.3。该规范已被修改。请在此处尝试阻止(死锁)

繁华开满天机

您不需要,至少对于同步(无缓冲)通道没有。在不要求从通道中获取值的情况下,无法判断一个值是否正在等待。对于缓冲通道,从技术上讲,您可以使用len函数执行您所描述的操作,但实际上,实际上不应该这样做。您的技术无效。原因是它代表比赛条件。给定通道ch,您的goroutine可能会看到len(ch)> 0并得出结论,有一个值在等待。但是,不能得出结论,它可以无阻塞地从通道读取数据-另一个goroutine可能会在您检查len到运行接收操作之间清空该通道。出于您描述的目的,请使用带有默认案例的select(如Ripounet所示)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go