关于遍历chan取出的数据调用函数有误的问题。萌新求教!

weixin_38064085 2019-09-20 10:46:56
代码如下(不完整):将1-100 分为10组,分别求和再相加。 taskChan 中有10个task,分别存着 1-10,11-20,,,,91-100这10组数字。 可是使用distributeTask1函数时,算出的结果每次都不一样。而使用distributeTask函数则结果正常。另外在t.do()方法中,我打印了每个task的 begin和 end。两次的结果分别如下

```go
package main

type task struct {
begin int
end int
result chan int
}

func (t *task) do(group *sync.WaitGroup) {
sum := 0
for i := t.begin; i <= t.end; i++ {
sum += i
}
fmt.Printf("begin:%d,end:%d\n",t.begin,t.end)
t.result <- sum
group.Done()
}

func distributeTask1(taskChan chan task, resultChan chan int, wg *sync.WaitGroup) {
for t := range taskChan {
wg.Add(1)

go t.do(wg)

}
wg.Wait()
close(resultChan)
}

func distributeTask(taskChan chan task, resultChan chan int, wg *sync.WaitGroup) {
for t := range taskChan {
wg.Add(1)
go processTask(t,wg)
}
wg.Wait()
close(resultChan)
}

func processTask(t task,wg *sync.WaitGroup){
t.do(wg)
}
```



...全文
35 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38075910 2019-09-20
  • 打赏
  • 举报
回复
这个跟range 有关,range 出来的是一个地址,每次改变里面的值。你直接用go 的话肯定是不行的,会有多次重复。你第二个函数增加了一次函数调用,使用参数传递的话,相当于赋值给了一个临时变量,所以每次的值都不同了,就不会有这个问题。
weixin_38076068 2019-09-20
  • 打赏
  • 举报
回复
懂了,非常感谢!!!

435

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧