将数据发送到两个通道,第二个通道可能会在某个时间首先接收数据

时间:2018-05-27 15:40:36

标签: go

package main

func m() {
    c1 := make(chan int, 1)
    c2 := make(chan int, 1)
    go func() {
        c1 <- 1
        c2 <- 1
    }()
    select {
    case <-c1:
    case <-c2:
        println("no way")
    }
}

func main() {
    for i := 0; i < 1000000; i++ {
        m()
    }
}

有两个频道c1c2

我们正在向goroutine中的c1c2发送数据。我们有一个select来接收来自这两个频道的数据并返回。

问题是:我们首先向c1发送数据,并在大多数情况下首先从c1收到数据。但有时我们会先向c2发送c1。为什么呢?