我是新学习的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
您每次迭代都会从通道中读取两次:
for i := range ch1
从通道读取值。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)
}