go 通道获取数据不符合预期

问题描述 投票:0回答:1

我是新学习的go版本1.22,在下面的代码中,for i := range ch1;如果会遍历ch1中的所有数据,如果已经有数据,则打印。 但为什么我的输出是

0 1
2 3
4 5
6 7
8 9

有一些数据丢失,索引1,3,5,7,9没有输出,有什么问题,有人可以帮助我吗?谢谢!

package main

import "fmt"

func main() {
    ch1 := make(chan int, 10)
    go func() {
        for i := 0; i < 10; i++ {
            ch1 <- i
        }
        close(ch1)
    }()
    for i := range ch1 {
        x, ok := <-ch1
        if !ok {
            break
        }
        fmt.Println(i, x)
    }
}

输出应该是

0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
go channel
1个回答
0
投票

您每次迭代都会从通道中读取两次:

  1. for i := range ch1
    从通道读取值。
  2. x, ok := <-ch1
    从通道读取下一个值。

您应该决定要使用哪一个。

关于 1)

for i := range ch1
不获取索引,而是从通道获取值。如果通道关闭,它将停止迭代。

    for x := range ch1 {
        fmt.Println(x)
    }

2) 在这种情况下,

ok
变量指示通道是否关闭:

    for {
        x, ok := <-ch1
        if !ok {
            break
        }
        fmt.Println(x)
    }
© www.soinside.com 2019 - 2024. All rights reserved.