为了账号安全,请及时绑定邮箱和手机立即绑定

goroutine使用了外面的变量,造成闭包问题。怎么解决呢?

goroutine使用了外面的变量,造成闭包问题。怎么解决呢?

HUH函数 2019-01-28 10:02:12
goroutine使用了外面的变量,造成闭包问题。怎么解决呢?
查看完整描述

2 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

自己思考了一下。其实,既然是闭包。那么,只要将item作为参数,传递给这个循环goroutine,就可以了 
他作为形参,自然不会被修改

// 从out队列接收数据

        for _,item := range result.Items {

            fmt.Println("got item: ",item)

            go func(rec interface{}) {

                c.ItemChan <- rec

            }(item)

        }

带缓冲的channel,我认为不是一个好的办法。因为,缓冲终归会满。

查看完整回答
反对 回复 2019-03-13
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

for _,item := range result.Items {

            //fmt.Println("got item: ",item)//把这个放 go func()里面

            go func() {

                fmt.Println("got item: ",item)

                c.ItemChan <- item

            }()

        }

这样你打印的就和接收到的数据是一样的了。
因为go func 并不能保证立即执行,在它还没有执行的时候,item值已经被for循环改变了

我有个疑问,你在写入的地方起goroutine是为了for循环不被写入阻塞吗?如果不想因为写入被阻塞,可以给channel定义一个缓冲。按照例子的,缓冲数定义为items的数量即可


查看完整回答
反对 回复 2019-03-13
  • 2 回答
  • 0 关注
  • 573 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信