【发布时间】:2018-03-11 19:26:29
【问题描述】:
在 for 循环生成的 goroutine 中似乎不可能的索引超出范围错误
这是我正在执行的 go 代码。
问题是在 goroutine 中对 countlinks 调用的参数之一的评估中产生了索引超出范围错误。我们迭代的切片长度始终为 2。根据我对 go 中 for 循环的理解,i 永远不应计算为 2(在表达式grph.entryPoints[i] 中产生超出范围的索引),但它确实如此。请告诉我我有多疯狂。
func main() {
grph := structures.ConfigGraphDefault()
counter := structures.NewCounter()
queue := structures.NewQueue()
tracker := structures.NewTracker()
fmt.Printf("entries: %v\nnodes: %v\n", grph.EntryPoints, grph.Nodes)
wg := sync.WaitGroup{}
fmt.Println(len(grph.EntryPoints))
// this will always evaluate to 2
l := len(grph.EntryPoints)
for i := 0; i < l; i++ {
wg.Add(1)
go func() {
fmt.Printf("index: %v, length of slice: %v\n", i, len(grph.EntryPoints))
structures.CountLinks(&grph, counter, queue, tracker, grph.EntryPoints[i], i)
wg.Done()
}()
}
wg.Wait()
fmt.Printf("counter: %v", counter.GetCounts())
}
【问题讨论】: