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

从列表的大小循环,但在 goroutine 中未调用某些索引

从列表的大小循环,但在 goroutine 中未调用某些索引

Go
MMMHUHU 2022-07-04 16:13:27
我有一个调度员工作人员,我从列表的长度循环获取作业数,但是在循环时有一些索引没有调用    var members = []Member{        {ID: 1, Is: true},        {ID: 2, Is: false},        {ID: 3, Is: true},    }    numOfWorker := 2    var durationDelay time.Duration = 5000    do, _ := worker.NewDispatcher(numOfWorker)    ch := make(chan worker.MainJob, len(members))    go func(jobs int) {        for i := 0; i < jobs; i++ {            newJob := &worker.NewJob{                Final: ch,                Do: func() worker.MainJob {                    return worker.MainJob{ID: i , Message: "test"}                },            }            do.Dispatch(newJob, durationDelay)        }        do.Await()        close(ch)    }(len(members))    for v := range ch {        fmt.Println(v)    }当我打印时,ch 我得到了这个:{1 test}{3 test}{3 test}所以没有调用 0 和 2 的索引,索引 3 是从哪里来的?成员的长度是3,所以它会叫0 1 2 我在这里犯错了吗?newJob 中的将Doworker.MainJob 的结果发送到Final它是这样的Final <- Do()最后是chan worker.MainJob并且Do是一个返回的函数worker.MainJob
查看完整描述

1 回答

?
素胚勾勒不出你

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

您需要隐藏循环变量。


https://github.com/golang/go/wiki/CommonMistakes#using-reference-to-loop-iterator-variable


        for i := 0; i < jobs; i++ {

            i := i

            newJob := &worker.NewJob{

                Final: ch,

                Do: func() worker.MainJob {

                    return worker.MainJob{ID: i , Message: "test"}

                },

            }

            do.Dispatch(newJob, durationDelay)

        }


查看完整回答
反对 回复 2022-07-04
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号