go - sync.WaitGroup和嵌套循环

标签 go goroutine

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

关于go - sync.WaitGroup和嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58533613/

相关文章:

go - 为什么 main goroutine 总是第二个被调用

go - 双 channel 死锁

go - Cloud Run从GCS下载文件的速度异常缓慢

shell - 使用 golang 过滤终端输出的输出

date - 如何添加日期至今

goroutine 不再被调度

go - 奇怪的选择案例默认行为

go - 总是有 x 个 goroutine 在任何时候运行

algorithm - slice 神奇地更新

postgresql - 如何查找从 db.Query postgres 返回的行数