Ответ
Да, можно изменять WaitGroup динамически, но с осторожностью. Основные методы Add() и Done() можно вызывать в разных горутинах, но важно соблюдать баланс между ними.
Пример:
var wg sync.WaitGroup
wg.Add(1) // начальное значение
go func() {
defer wg.Done()
// какая-то работа
}()
// Динамически добавить ещё задачи
wg.Add(1)
go func() {
defer wg.Done()
// другая работа
}()
wg.Wait() // ждём завершения всех
Важно:
- Нельзя вызывать
Add()с отрицательным числом послеWait(), иначе будет паника. Done()уменьшает счётчик на 1, и если он станет отрицательным — тоже паника.- Лучше вызывать
Add()до запуска горутин, чтобы избежать гонок.