首页 > 解决方案 > 写入两个单独的通道是否可靠地顺序?

问题描述

如果我在两个频道上有一个选择:

for {
    select {
    case <-chan1:
        // do something
    case <-chan2:
        // do something else
    }
}

在一个单独的 goroutine 中,我按顺序写入这些通道:

chan1 <- "blah"
chan2 <- true

我能保证在“做其他事情”之前看到“做某事”吗?

我知道如果 select 有两个未阻塞的通道,它会随机选择,但是我认为如果 select 已经阻塞,写入第一个通道可能会可靠地“中断”写入 goroutine,这意味着 select 将在未阻塞的第一个通道上运行之前第二个写。

标签: gochannelgoroutine

解决方案


是的,如果通道没有缓冲,您可以依靠它。请参阅Go 内存模型


推荐阅读