【发布时间】:2015-05-07 18:04:26
【问题描述】:
如果没有在 select 语句中的正确时刻捕获通过 golang 中的通道进入的数据,是否有可能被忽略?
例如,假设有这样的选择语句:
for {
select {
case <-timer.C:
//block A
default:
// block B takes 2 seconds.
}
}
如果定时器在块 B 运行时结束,块 A 是否仍会在循环的下一次迭代中运行,还是通道的传入数据会丢失?
【问题讨论】:
-
在发送端,如果它是一个有空间的缓冲通道,那么数据就会被缓冲。否则,它取决于写入器是否阻塞,以及它是否不阻塞,是否重试或继续并丢弃数据。删除/忽略数据的另一种方法是让读取器退出而不读取缓冲项。