我正在编写一些代码,将数据从一个通道传递到另一个通道。遵循一些直觉和这个答案,我希望以下代码能够工作(other是一个足够大的缓冲通道并且out是源通道):
for {
select {
case other <- (<-out):
log.Warn("C")
}
}
确实如此!但其他情况根本不会触发,例如日志中没有Ds 用于以下代码:
for {
select {
case other <- (<-out):
log.Warn("C")
default:
log.Warn("D")
}
}
使用更传统的解决方案,D日志中到处都是 s:
for {
select {
case msg := <-out:
other <- msg
log.Warn("C")
default:
log.Warn("D")
}
}
显然,我将使用通常的解决方案,但我仍然不知道为什么不寻常的解决方案无法按预期工作。
我怀疑答案在Go Memory Model 中的某个地方,但我无法完全弄清楚在这种情况下到底发生了什么。
我整理了一些游乐场,您可以在其中查看此行为:
Unusal(根本没有Ds)
通常(有很多Ds,您可能必须在本地尝试才能看到除Ds之外的任何内容)
提前感谢任何可以对此有所了解的人!
叮当猫咪
相关分类