Работа с HTTP
Каждый HTTP-запрос запускается в отдельной горутине, а результат передаётся в канал. Это позволяет выполнять запросы параллельно и обрабатывать их независимо.
Асинхронные HTTP-запросы реализуются с помощью горутин. Для каждой URL создаётся отдельная горутина, которая делает запрос и отправляет результат (или ошибку) в канал. Основной поток получает результаты через range по каналу.
Для управления завершением всех запросов удобно использовать sync.WaitGroup, а для отмены по таймауту — context.WithTimeout. Такой подход даёт гибкость и масштабируемость при работе с сетевыми вызовами.
urls := []string{
"https://example.com",
"https://golang.org",
"https://google.com",
}
ch := make(chan string)
for _, url := range urls {
go func(u string) {
resp, err := http.Get(u)
if err != nil {
ch <- fmt.Sprintf("error: %v", err)
return
}
defer resp.Body.Close()
ch <- fmt.Sprintf("%s: %d", u, resp.StatusCode)
}(url)
}
for range urls {
fmt.Println(<-ch)
}