我对 Go 很陌生,我正在尝试了解无缓冲通道和 goroutines。我有这个代码:func main() {var waitGroup sync.WaitGroupwaitGroup.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 = 21 * 3 = 31 * 4 = 4相反,我得到:1 * 2 = 21 * 4 = 4fatal error: all goroutines are asleep - deadlock!我真的不明白为什么第二个函数会在第三个函数之后执行。如何在不将通道更改为缓冲通道的情况下获得结果。
1 回答
Cats萌萌
TA贡献1805条经验 获得超9个赞
您似乎希望<-
操作员关心 goroutines 的创建顺序。这不是承诺的(甚至是不可能的)。如果两个<-
操作员正在读取同一个通道,则哪一个得到的值是随机的。如果你想订购这个,你需要创建另一个通道,第二个 goroutine 写入,第三个读取。
缓冲在这里无济于事,因为问题不在于它在写入时阻塞。这是第三个函数消耗一个值并且不生成一个值,所以第二个函数没有什么可读取的。
- 1 回答
- 0 关注
- 84 浏览
添加回答
举报
0/150
提交
取消