You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:52:13