小编kal*_*ant的帖子

使用异常选择的意外行为

我正在编写一些代码,将数据从一个通道传递到另一个通道。根据一些直觉和这个答案,我希望以下代码可以工作(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 的某个地方,但我无法弄清楚在这种情况下到底发生了什么。

我整理了一些游乐场,您可以在其中查看这种行为:

  • 不寻常(根本没有Ds)
  • 通常(有很多Ds,您可能必须在本地尝试才能看到Ds以外的任何内容)

在此先感谢任何可以对此有所了解的人!

concurrency channel go

2
推荐指数
1
解决办法
51
查看次数

标签 统计

channel ×1

concurrency ×1

go ×1