package main
import (
"fmt"
)
func main() {
in := make(chan int, 10)
out := make(chan int)
for i := 0; i < 10; i++ {
in <- i
}
close(in)
go func() {
for {
i, ok := <-in
if !ok {
close(out)
break
}
out <- i * 2 //THIS LINE
}
}()
for v := range out { // AND HERE
fmt.Println(v)
}
}
我对Go有点陌生,了解了缓冲 channel 和非缓冲 channel 之间的区别,但是我不确定这段代码如何工作。由于out
channel 未缓冲,是否应该创建死锁?我想念什么?
最佳答案
out
channel 是未缓冲的,因此如果您在没有其他goroutine等待读取的情况下对其进行写入,则它将阻塞。读取相同:它将阻塞直到另一个goroutine向其写入。因此,goroutine阻止写出,直到main中的for循环从中读取为止。主goroutine将从中读出,直到关闭为止,因此当goroutine最终关闭时,for循环终止。
关于go - 无缓冲 channel -多值传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62628595/