为什么代码的这一部分在另一部分之前执行



我是Go的新手,我正在努力学习无缓冲通道和goroutines。

我有这个代码:

func main() {
var waitGroup sync.WaitGroup
waitGroup.Add(3)
c := make(chan int)
go func() {
defer waitGroup.Done()
x := 1
res := x * 2
fmt.Println(x, "* 2 = ", res)
c <- x
}()
go func() {
defer waitGroup.Done()
x := <-c
res := x * 3
fmt.Println(x, "* 3 = ", res)
c <- x
}()
go func() {
defer waitGroup.Done()
x := <-c
res := x * 4
fmt.Println(x, "* 4 = ", res)
}()
waitGroup.Wait()
close(c)

}

所以我预计输出是:

1 * 2 =  2
1 * 3 =  3
1 * 4 =  4

相反,我得到了:

1 * 2 =  2
1 * 4 =  4
fatal error: all goroutines are asleep - deadlock!

我真的不明白为什么第二个函数在第三个函数之后执行。如何在不将通道更改为缓冲通道的情况下获得结果。

您似乎希望<-运算符关心goroutines的创建顺序。这并没有得到承诺(甚至可能(。如果两个<-操作符正在读取同一个通道,那么哪个操作符得到的值是随机的。如果你想订购这个,你需要创建另一个通道,第二个goroutine写入,第三个读取。

缓冲在这里没有帮助,因为问题不在于它会阻止写入。第三个函数消耗了一个值而没有生成一个值,所以第二个函数没有什么可读取的。

去游乐场

相关内容

最新更新