我正在阅读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/

10-10 14:33