У меня есть фрагмент, который содержит работу, которая будет выполнена, и срез, который будет содержать результаты, когда все будет сделано. Ниже приводится схема моего общего процесса:
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
Кажется, что это работает, но я не тестировал его полностью и не уверен, что это безопасно. В общем, я бы не чувствовал себя хорошо, позволяя нескольким гортанам писать что угодно, но в этом случае каждый горутин ограничивается собственным индексом в срезе, который предварительно выделен.
Я полагаю, что альтернатива собирает результаты через канал, но поскольку порядок результатов имеет значение, это казалось довольно простым. Безопасно ли писать элементы среза таким образом?