Проверяет понимание координации горутин и выбор правильного примитива.
WaitGroup предназначен именно для ожидания завершения набора горутин. Канал — более универсальный инструмент, но для простой синхронизации завершения WaitGroup проще и безопаснее.
sync.WaitGroup — специализированный примитив:
считает количество активных задач;
блокирует Wait() до тех пор, пока счётчик не станет 0.
Разница:
WaitGroup не передаёт данные, только синхронизирует;
канал может передавать сигналы и данные, но требует аккуратного закрытия;
WaitGroup проще читать и поддерживать для этой задачи.
Когда использовать канал:
нужен fan-in / fan-out;
требуется передача данных;
нужна динамическая сигнализация.
Вывод: для ожидания завершения — WaitGroup, для коммуникации — каналы.