golang.org/x/sync/errgroup?errgroup.Group запускает несколько горутин (g.Go(fn)) и ждёт их завершения (g.Wait()). Возвращает первую возникшую ошибку. С errgroup.WithContext при первой ошибке отменяется переданный context - остальные горутины могут завершиться по ctx.Done().
g, ctx := errgroup.WithContext(ctx)
g.Go(func() error { return fetchURL(ctx, url1) })
g.Go(func() error { return fetchURL(ctx, url2) })
if err := g.Wait(); err != nil {
return err
}
Удобная замена ручному sync.WaitGroup и сбору ошибок из каналов.