Go 并发 通道(channel) x, y := <-c, <-c // 这里为什么x得到是第二个通道的结果 而不是第一个

package main

import "fmt"

func sum(s []int, c chan int) {
    sum := 0
    for _, v := range s {
        sum += v
    }
    c <- sum // 把 sum 发送到通道 c
}

func main() {
    s := []int{7, 2, 8, -9, 4, 0}

    c := make(chan int)

    go sum(s[len(s)/2:], c)
    go sum(s[:len(s)/2], c)
    x, y := <-c, <-c // 从通道 c 中接收

    fmt.Println(x, y, x+y)
    //x=-5 y=17 x+y=12  
    //这里为什么x得到是第二个通道的结果  而不是第一个
    
    
}

1584676982(1).jpg

阅读 2.7k
3 个回答

复制运算符是右结合的运算符,右结合的运算符由右向左运算

协程哪一个会先发送是不一定的 ....

先启动的也不一定先执行完 ...

被采纳的答案是误导,实际上是无序的。从两个通道中获取很难看出差异,扩展下改成三个通道

func main(){

    s := []int{7, 2, 8, -9, 4, 0}

    c := make(chan int)
    fmt.Println(s[:2]);
    fmt.Println(s[2:4]);
    fmt.Println(s[4:]);
    go sum(s[:2], c)                    //结果是 7 + 2 = 9
    go sum(s[2:4], c)                    //结果是 8 +-9 = -1
    go sum(s[4:], c)                    //结果是 4 + 0 = 4
    x, y ,z := <-c, <-c ,<-c                //从通道 c 中接收

    fmt.Println(x, y, z, x+y+z);        
}

以下是运行10多次的结果,可看出结果并非唯一的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题