我正在编写一些代码,将数据从一个通道传递到另一个通道。根据一些直觉和这个答案,我希望以下代码可以工作(other是一个足够大的缓冲通道,并且out是源通道):
for {
select {
case other <- (<-out):
log.Warn("C")
}
}
Run Code Online (Sandbox Code Playgroud)
确实如此!但其他情况根本不会触发,例如D下面代码的日志中没有s:
for {
select {
case other <- (<-out):
log.Warn("C")
default:
log.Warn("D")
}
}
Run Code Online (Sandbox Code Playgroud)
使用更传统的解决方案,D日志中到处都是:
for {
select {
case msg := <-out:
other <- msg
log.Warn("C")
default:
log.Warn("D")
}
}
Run Code Online (Sandbox Code Playgroud)
显然,我将采用通常的解决方案,但我仍然不知道为什么不寻常的解决方案不能按预期工作。
我怀疑答案就在Go Memory Model 的某个地方,但我无法弄清楚在这种情况下到底发生了什么。
我整理了一些游乐场,您可以在其中查看这种行为:
在此先感谢任何可以对此有所了解的人!