Теория
Как в Go дождаться завершения всех запущенных горутин и использовать результаты?
Базовый шаблон sync.WaitGroup: Add до запуска, defer Done внутри, Wait перед чтением результатов. Как избежать гонок при сборе данных.
Читать ответ