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 语言通道遍历结果怪异之谜:程序只能输出奇数索引的值?的详细内容,更多请关注php中文网其它相关文章!