🟡 Средний · 2 очк. Пакет sync
Какая ошибка: var wg sync.WaitGroup; for i := 0; i < 5; i++ { go func() { wg.Add(1); work(); wg.Done() }() }; wg.Wait()?
A Код корректен
B wg.Add(1) должен вызываться ДО запуска горутины
C wg.Done() не нужен
D Нужен sync.Mutex
Объяснение вопроса

Ошибка в том, что 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
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.