账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    goroutine使用了外面的变量,造成闭包问题。怎么解决呢?
    79
    0

    问题描述

    我有这样一个程序,他从一个items列表中读取items,然后,打印一下这个item,交个一个channel

    // 从out队列接收数据
            for _,item := range result.Items {
                fmt.Println("got item: ",item)
                go func() {
                    c.ItemChan <- item
                }()
            }

    在另一个地方,起了一个goroutine,来接收

        go func() {
            count := 0
            for {
                item := <- out
                count++
                fmt.Printf("获取到的item:%d,当前saver计数count是:%d\n",item,count)
            }
        }()

    很简单的一个东西,但是发现。写入是打印的item没有重复,但读取的channel,打印有重复。
    最后发现应该是写入是,channel阻塞,而外层循环还在继续,导致item更新了,然后在写入channel的已经是几个相同的item了

    问题出现的环境背景及自己尝试过哪些方法

    我尝试给写入添加sleep,这样只要确保这个被消费了,然后在写入,就没问题

            for _,item := range result.Items {
                time.Sleep(time.Millisecond * 100)
                fmt.Println("got item: ",item)
                go func() {
                    c.ItemChan <- item
                }()
            }

    但显然,这个不符合需求。

    那么,我的问题是,我有一个列表要不断读取,通过goroutine塞到一个channel里面,但这样会造成闭包问题,该怎么解决呢?

    也许,将写入改成一个大的goroutine是个好办法?
    goroutine包裹整个for循环,然后,此时在写入channel就是阻塞的了

    相关代码

    // 请把代码文本粘贴到下方(请勿用图片代替代码)

    你期待的结果是什么?实际看到的错误信息又是什么?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部