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,我认为不是一个好的办法。因为,缓冲终归会满。
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的数量即可
- 2 回答
- 0 关注
- 573 浏览
添加回答
举报