问题描述我有这样一个程序,他从一个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,我认为不是一个好的办法。因为,缓冲终归会满。
叮当猫咪
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的数量即可
添加回答
举报
0/150
提交
取消