当我从 golang.org 浏览 Golang 时,有一个代码片段我不明白:
func sum(a []int, c chan int, order int) {
sum := 0
for _, v := range a {
sum += v
}
fmt.Println(order, a)
c <- sum // 将和送入 c
}
func main() {
a := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
a1, a2 := a[:len(a)/2], a[len(a)/2:]
go sum(a1, c, 1)
x := <-c
go sum(a2, c, 2)
y := <-c
//x := <-c
//y := <-c
// x, y := <-c, <-c // 从 c 中获取
fmt.Println(x, y, x+y)
}
这是我期望的输出:
1 [7 2 8]
2 [-9 4 0]
17 -5 12
当我更改代码时:
func main() {
a := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
a1, a2 := a[:len(a)/2], a[len(a)/2:]
go sum(a1, c, 1)
//x := <-c
go sum(a2, c, 2)
//y := <-c
x := <-c
y := <-c
// x, y := <-c, <-c // 从 c 中获取
fmt.Println(x, y, x+y)
}
为什么输出是这样的:
2 [-9 4 0]
1 [7 2 8]
-5 17 12
最佳答案
问题是你错过了并发的概念 无法保证按照 go 调用函数的确切顺序执行函数
第一个代码片段有序工作的原因是 x := <-c
部分
此行强制您的应用程序等待 c channel 充满数据,这样第二个 goroutine 就不会被调用
关于go - 同一 Channel 中的两个 goroutine - 它们是如何执行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46640390/