Go 1.22中Channel遍历数据丢失问题求助
问题分析与解决方案
问题根源
你代码里的for i := range ch1本身会每次从channel读取一个值赋值给i,但你在循环体里又额外执行了x, ok := <-ch1,这相当于每次循环从channel里读取了两个元素。
channel里一共写入了10个元素(0-9),每次循环消耗2个,所以只会执行5次循环,输出0&1、2&3...这样的结果,自然丢失了一半的数据。
修复后的代码
如果你想实现预期的输出(每个元素输出两次,比如0 0),只需要去掉循环体里额外的channel读取操作,直接打印i两次即可:
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 { fmt.Println(i, i) } }
如果你的需求是依次读取并打印每个元素(不需要重复),那只需要打印i即可:
for i := range ch1 { fmt.Println(i) }
补充说明
for range遍历channel时,会持续从channel读取元素,直到channel被关闭且所有元素都被读取完毕。- 不要在
for range遍历channel的同时,再手动执行<-ch读取,这会导致元素被重复消耗,出现数据丢失或逻辑错误。
内容的提问来源于stack exchange,提问作者Leo Xu
相关产品推荐
相关产品推荐

