一尘不染

sync.WaitGroup和嵌套循环

go

我想为迭代嵌套循环添加并发性,但是遇到了麻烦。这个示例使用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

因此,您可能会看到它跳过了两个数组的第一个元素,而仅迭代了最后一个元素。任何想法如何解决此问题?


阅读 382

收藏
2020-07-02

共1个答案

一尘不染

这是一个关闭问题。您需要将值传递到循环内的goroutine中,如下所示:

for _, originIata := range originCities {
    for _, destinationIata := range destinationCities {
        go func (originIata, destinationIata string) {
            fmt.Println(originIata)
            fmt.Println(destinationIata)
            wg.Done()
        }(originIata, destinationIata)
    }
}
2020-07-02