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

looping from size of list but some index not called when in goroutine

我有一个调度员工作人员,我从列表的长度中循环查找作业数量,但是在循环时有一些索引没有被调用

    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中的Do将worker.MainJob的结果发送给Final

是这样的

Final <- Do()

最后一个是chan worker.MainJobDo是一个returnsworker.MainJob

的函数

您需要隐藏循环变量。

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)
        }