我想为迭代嵌套循环添加并发性,但是遇到了麻烦。这个示例使用sync.WaitGroup有什么问题?
originCities := [3]string{"LED", "MOW", "PRS"} destinationCities := [2]string{"UKT", "AAC"} wg := &sync.WaitGroup{} wg.Add(len(originCities) * len(destinationCities)) for _, originIata := range originCities { for _, destinationIata := range destinationCities { go func () { fmt.Println(originIata) fmt.Println(destinationIata) wg.Done() }() } } wg.Wait()
我越来越
PRS AAC PRS AAC PRS AAC PRS AAC PRS AAC PRS AAC
因此,您可能会看到它跳过了两个数组的第一个元素,而仅迭代了最后一个元素。任何想法如何解决此问题?
这是一个关闭问题。您需要将值传递到循环内的goroutine中,如下所示:
for _, originIata := range originCities { for _, destinationIata := range destinationCities { go func (originIata, destinationIata string) { fmt.Println(originIata) fmt.Println(destinationIata) wg.Done() }(originIata, destinationIata) } }