如何确定从渠道接收的顺序?

Ida*_*dan -2 channel go goroutine

考虑以下来自go 之旅的示例。

如何确定频道的接收顺序?为什么 x 总是从 gorouting 获得第一个输出?这听起来很合理,但我没有找到任何关于它的文档。我尝试添加一些睡眠,但仍然从第一次执行的 gorouting 中获取输入。

    c := make(chan int)
    go sumSleep(s[:len(s)/2], c)
    go sum(s[len(s)/2:], c)
    x, y := <-c, <-c // receive from c

    fmt.Println(x, y, x+y)
Run Code Online (Sandbox Code Playgroud)

睡眠是发送到通道之前。

Adr*_*ian 6

消息总是按照发送的顺序接收。那是确定性的。

然而,跨越并发够程任何操作的执行顺序是确定性的。因此,如果您有两个 goroutine 同时在一个通道上发送,您将无法知道哪个先发送,哪个再发送。如果您有两个 goroutine 在同一个频道上接收,则相同。