var wg sync.WaitGroup; for i := 0; i < 5; i++ { go func() { wg.Add(1); work(); wg.Done() }() }; wg.Wait()?Ошибка в том, что wg.Add(1) вызывается внутри горутины. Главная горутина может дойти до wg.Wait() раньше, чем все воркеры успеют вызвать Add(1). Тогда Wait() увидит счётчик 0 и сразу вернётся - программа завершится, не дождавшись горутин.
// Неправильно:
for i := 0; i < 5; i++ {
go func() {
wg.Add(1) // гонка: главная может вызвать Wait() до этих Add
defer wg.Done()
work()
}()
}
wg.Wait()
wg.Add(5)
for i := 0; i < 5; i++ {
go func() {
defer wg.Done()
work()
}()
}
wg.Wait()
// или: wg.Add(1) перед каждой go func() - но обязательно до go