Этот вопрос проверяет умение распараллелить I/O-задачи через горутины и ждать результаты.
Соберите горутины, каждая выполняет HTTP-запрос, и используйте sync.WaitGroup для ожидания их завершения. Результаты собирайте в канал или срез, защищая доступ Mutex или через заранее инициализированный срез по индексу. По завершении WaitGroup.Wait() агрегируйте данные.
WaitGroup + каналы:
var wg sync.WaitGroup
results := make(chan Result)
for _, url := range urls {
wg.Add(1)
go func(u string) {
defer wg.Done()
res := fetch(u)
results <- res
}(url)
}
go func() {
wg.Wait()
close(results)
}()
for r := range results { process(r) }Buffered Channel:
make(chan Result, len(urls)) чтобы избежать блокировок при отправке.
Mutex + срез:
mu := sync.Mutex{}
out := make([]Result, len(urls))
// внутри горутины: mu.Lock(); out[i]=res; mu.Unlock()Контекст и таймауты:
Используйте context.WithTimeout для отмены долгих запросов.