WaitGroup и errgroup: как дождаться горутин и собрать ошибки
sync.WaitGroup — счётчик незавершённых задач: Add увеличивает, Done уменьшает, Wait блокирует до нуля. Начиная с Go 1.25 у него есть метод Go, который сам делает Add(1), запускает горутину и вызывает Done через defer, — он снимает две классические ошибки: Add внутри горутины (гонка с Wait) и забытый Done при раннем возврате. Чего WaitGroup не умеет — собирать ошибки и отменять остальные задачи при первом сбое. Для этого есть golang.org/x/sync/errgroup: g.Go(func() error {...}) возвращает первую ненулевую ошибку из g.Wait(), а errgroup.WithContext дополнительно отменяет общий контекст при первой ошибке, чтобы остальные задачи не работали впустую. У errgroup есть и SetLimit для ограничения числа одновременных задач. Общее правило для обоих: WaitGroup нельзя копировать, поэтому передают указатель или пользуются замыканием.