golang.org/x/sync/errgroup — запуск группы горутин с отменой при первой ошибке.
import "golang.org/x/sync/errgroup"
g, ctx := errgroup.WithContext(context.Background())
urls := []string{"https://a.com", "https://b.com", "https://c.com"}
for _, url := range urls {
g.Go(func() error {
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
resp, err := http.DefaultClient.Do(req)
if err != nil {
return err // первая ошибка отменит ctx для остальных
}
defer resp.Body.Close()
return nil
})
}
if err := g.Wait(); err != nil {
log.Fatal(err) // первая ошибка из группы
}
С лимитом параллелизма (Go 1.20+):
g.SetLimit(5) // макс 5 параллельных горутин
g.Wait() блокирует до завершения всех горутин и возвращает первую ошибку. Отмена контекста — автоматическая, не нужно вручную cancel.