golang 无缓冲区通道的 range 操作
对一个无缓冲通道(chan)进行 range 操作意味着想要迭代并消费通道中的所有值。
但是,由于无缓冲通道的特性,这种操作具有特定的行为和潜在的副作用,主要体现在以下几点:
阻塞行为:
当你开始对无缓冲通道进行 range 操作时,每次循环迭代都会尝试从通道接收一个值。
如果通道中有值可用,range 会继续进行。
如果通道中没有值并且没有其他 goroutine 向通道发送值,range 会阻塞,等待值的到来。
如果通道被关闭并且没有更多的值,range 循环将结束。
通道关闭的重要性:
为了使 range 循环正常结束,通常需要在所有值发送完毕后关闭通道。
如果通道没有被关闭,range 可能会永远阻塞,因为没有值可以接收,也没有信号表明通道已经完成发送。
https://github.com/farwish/go-lab/blob/master/src/builtin/chan_range.go