登录
首页 >  Golang >  Go教程

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

时间:2024-11-18 17:28:01 163浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《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 循环中,你不仅遍历通道,还从通道中读取值。这会导致游标在通道中前进两次:一次是由遍历本身,一次是由 <-ch。

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

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

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

0 1 2 3 4 5 6 7 8 9

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

本篇关于《Go 语言通道遍历结果怪异之谜:为什么程序只能输出奇数索引的值?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>