我有一个切片,其中包含要完成的工作,还有一个切片,它将包含完成所有工作后的结果.以下是我的一般流程简图:
var results = make([]Result, len(jobs))
wg := sync.WaitGroup{}
for i, job := range jobs {
wg.Add(1)
go func(i int, j job) {
defer wg.Done()
var r Result = doWork(j)
results[i] = r
}(i, job)
}
wg.Wait()
// Use results
它似乎起作用了,但我还没有彻底测试过,也不确定这样做是否安全.通常,让多个goroutine写入anything会让我感觉不太好,但在本例中,每个goroutine都被限制到它自己在片中的索引,这是预先分配的.
我想另一种 Select 是通过渠道收集结果,但由于结果的顺序很重要,这似乎相当简单.以这种方式写入切片元素是否安全?