我正在阅读The Go Programming Language的8.5章,并且陷入了一些代码的困境。下面的代码列表。
func main() {
naturals := make(chan int)
squares := make(chan int)
// Counter
go func() {
for x := 0; x <= 5; x++ {
naturals <- x
}
close(naturals)
}()
// Squarer
go func() {
for v := range naturals {
squares <- v * v
}
close(squares)
}()
// for x := range squares {
// fmt.Println(x)
// }
// OUTPUT(correct):
// 0
// 1
// 4
// 9
// 16
// 25
// for y := 0; y <= 5; y++ {
// fmt.Println(<-squares)
// }
// OUTPUT(correct):
// 0
// 1
// 4
// 9
// 16
// 25
// for {
// fmt.Println(<-squares)
// }
// OUTPUT(incorrect):
// 0
// 0
// 0
// 0
// 0
// 0
// ...
}
我能理解前2个的工作原理,但是第3个似乎出乎意料。所以我的问题是,为什么第三个打印功能不会阻塞,并且总是打印0。
最佳答案
第三循环的输出是...
0
1
4
9
16
25
0
0
0
等等。它看起来只是零而已,因为第一个数字已滚出屏幕。从关闭的通道读取将导致通道类型为零。这是无限循环中的一个int通道,因此您得到无限0。
关于go - 去 channel 无限循环不阻塞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63931148/