从列表的大小循环但在 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.MainJob
,Do
是一个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)
}
我有一个调度员工作人员,我从列表的长度中循环查找作业数量,但是在循环时有一些索引没有被调用
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.MainJob
,Do
是一个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)
}