(并发编程新手) 怀疑为什么goroutine的执行流程在这里有点怪异?
开始使用golang进行goroutines和channel操作。
func main() {
// Set up the pipeline.
c := gen(2, 3)
out := sq(c)
// Consume the output.
fmt.Println(<-out) // 4
fmt.Println(<-out) // 9
}
func sq(in <-chan int) <-chan int {
out := make(chan int)
go func() {
for n := range in {
out <- n * n
}
close(out)
}()
return out
}
func gen(nums ...int) <-chan int {
out := make(chan int)
go func() {
for _, n := range nums {
out <- n
}
close(out)
}()
return out
}
答案 0 :(得分:2)
对gen
和sq
的调用完成后,将同时运行3个goroutine。它们在通道之间传递数据,因此执行产生相同的结果。
他们总是至少传递2条信息,因此按照下面的顺序运行代码
out <- n
-2-> sq-inner out <- n * n
-4-> main println(<-out)
out <- n
-3-> sq-inner out <- n * n
-9-> main println(<-out)
可能还会发生第三遍,但是可能会在main
goroutine结束时被跳过。
close()
-close-> sq-inner close(out)
-close-> 答案 1 :(得分:2)