写入两个独立的通道是否可靠地顺序进行?

Is writing to two separate channels reliably sequential?

如果我在两个频道上有 select:

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

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

chan1 <- "blah"
chan2 <- true

我能保证在 "do something else" 之前看到 "do something" 执行吗?

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

是的,如果通道是无缓冲的,您可以依赖它。见 Go Memory Model.