为什么这段 Go 程序输出的不是 0 到 9 的数字序列?

为什么这段 go 程序输出的不是 0 到 9 的数字序列?

为什么这段 go 程序输出的是奇数

以下 go 程序旨在将数字 0 到 9 写入一个缓冲区为 10 的管道,然后遍历管道并打印其内容:

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。

原因

这个结果是由管道遍历的实现造成的。在 go 中,使用 for range 语句遍历管道时,它会不断地从管道中读取值。在给定的程序中,每次遍历迭代都会从管道中读取一个值,导致游标每次都前进两个位置,因为管道通道为 10,所以在遍历时会使得从管道中读出的数字对应着奇数。

解决方案

为了正确地输出管道中的值,需要修改遍历循环,不再直接读取管道中的值,而是将其存储到一个变量中:

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

这样,每次迭代都会将管道中的值存储到变量 v 中,而游标不会再前进。因此,输出将是正确的数字序列:0 1 2 3 4 5 6 7 8 9。

以上就是为什么这段 Go 程序输出的不是 0 到 9 的数字序列?的详细内容,更多请关注其它相关文章!