Go 语言通道遍历结果怪异之谜:为什么程序只能输出奇数索引的值?

go 语言通道遍历结果怪异之谜:为什么程序只能输出奇数索引的值?

go 语言基础:通道遍历结果怪异之谜

在 go 语言中,通道是一种强大的并发机制。当我们使用通道传输数据时,可能遇到一些奇怪的结果。本文将探讨一个经典示例,揭示其背后的原因并提供一种正确的遍历方法。

问题:

下列程序段产生的输出令人困惑:

package main

import "fmt"

func main() {
    ch := make(chan int, 10)
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch)
    for range ch {
        fmt.println(<-ch)
    }
}

结果:

1 3 5 7 9

解答:

此问题源于通道遍历的方式。在最终 for 循环中,你不仅遍历通道,还从通道中读取值。这会导致游标在通道中前进两次:一次是由遍历本身,一次是由

因此,最终输出仅包含通道中奇数索引的值。要正确打印所有值,应将最终 for 循环修改为:

for v := range ch {
    fmt.println(v)
}

这样,遍历就不会再从通道中读取值,因此输出正确:

0 1 2 3 4 5 6 7 8 9

通过理解通道遍历的机制,我们可以避免意外的结果,确保代码的正确性。

以上就是Go 语言通道遍历结果怪异之谜:为什么程序只能输出奇数索引的值?的详细内容,更多请关注其它相关文章!