Выбор ответа Middle sync и атомики спрашивают часто обновлено

wg.Add внутри горутины

Вопрос

Почему wg.Add(1) нельзя вызывать внутри запускаемой горутины?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Wait может пройти раньше, чем горутина вызовет Add. Горутина может стартовать позже, чем main дойдёт до Wait.

Варианты ответа

  1. Add можно вызывать только один раз, до первого запуска горутины
  2. Это всегда приводит к дедлоку: Wait и Add ждут друг друга
  3. Wait может пройти раньше, чем горутина вызовет Addправильный ответ
  4. Add внутри горутины не компилируется, WaitGroup это запрещает

Разбор

Горутина может стартовать позже, чем main дойдёт до Wait. Если счётчик в этот момент 0, Wait вернётся сразу. Поэтому Add вызывают до go. Add можно вызывать многократно и с любым положительным числом, дедлока не будет, просто ожидание сломается, и компилятор это не проверяет. В Go 1.25 появился wg.Go(f), который делает Add правильно сам.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.