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

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

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

RISEBY 2019-04-27 22:19:59
问题描述我有这样一个程序,他从一个items列表中读取items,然后,打印一下这个item,交个一个channel//从out队列接收数据for_,item:=rangeresult.Items{fmt.Println("gotitem:",item)gofunc(){c.ItemChan
查看完整描述

2 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

自己思考了一下。其实,既然是闭包。那么,只要将item作为参数,传递给这个循环goroutine,就可以了他作为形参,自然不会被修改
//从out队列接收数据
for_,item:=rangeresult.Items{
fmt.Println("gotitem:",item)
gofunc(recinterface{}){
c.ItemChan<-rec
}(item)
}
带缓冲的channel,我认为不是一个好的办法。因为,缓冲终归会满。
                            
查看完整回答
反对 回复 2019-04-27
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

你打印写入的地方有问题。
for_,item:=rangeresult.Items{
//fmt.Println("gotitem:",item)//把这个放gofunc()里面
gofunc(){
fmt.Println("gotitem:",item)
c.ItemChan<-item
}()
}
这样你打印的就和接收到的数据是一样的了。因为gofunc并不能保证立即执行,在它还没有执行的时候,item值已经被for循环改变了
我有个疑问,你在写入的地方起goroutine是为了for循环不被写入阻塞吗?如果不想因为写入被阻塞,可以给channel定义一个缓冲。按照例子的,缓冲数定义为items的数量即可
                            
查看完整回答
反对 回复 2019-04-27
  • 2 回答
  • 0 关注
  • 554 浏览
慕课专栏
更多

添加回答

举报

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