Go 从不同通道进入select语句的数据是否会被忽略?

Go 从不同通道进入select语句的数据是否会被忽略?,go,channel,Go,Channel,如果在select语句中的正确时刻未捕获到通过golang中的通道传入的数据,是否可能被忽略 例如,假设存在以下select语句: for { select { case <-timer.C: //block A default: // block B takes 2 seconds. } } 用于{ 挑选{ case当计时器过期时,它将在C上发送当前时间。如果当时没有人从C读取,则发送将被阻止,因此它将等待直到收到该值。在

如果在select语句中的正确时刻未捕获到通过golang中的通道传入的数据,是否可能被忽略

例如,假设存在以下select语句:

for {
    select {
    case <-timer.C:
        //block A
    default:
        // block B takes 2 seconds.
    }
}
用于{
挑选{

case当计时器过期时,它将在C上发送当前时间。如果当时没有人从C读取,则发送将被阻止,因此它将等待直到收到该值。在这种情况下,它将等待循环的下一次迭代


通道被设计为一种同步机制,因此它们不要求读写器已经同步。

轻微校正,
时间。NewTimer
使用一个缓冲通道,使其无法阻塞。它会将时间写入缓冲区,稍后有人读取它,或者,如果计时器和通道不再是参考的话d、 它们最终会被垃圾收集。相关,
时间。NewTicker
还使用缓冲区大小为1的通道,并执行非阻塞发送。如果读卡器落后,则记录为丢弃刻度(如果缓冲区已满,则丢弃下一个刻度)。感谢您的澄清。我没有费心查看源代码以查看通道是否已缓冲。这是一个次要的实现细节,您的答案仍然正确。在发送端,如果是有空间的缓冲通道,则数据将被缓冲。否则,这取决于写入程序是否阻塞,以及重试时是否未阻塞s或继续并删除数据。另一种删除/忽略数据的方法是,读卡器退出而不读取缓冲项。