Запустите по горутине на URL, используйте общий HTTP-клиент с тайм-аутом и WaitGroup. Сетевая ошибка выводится отдельно от полученного HTTP-кода.
Одновременные HTTP‑запросы и отображение кодов статуса
Запустите по горутине на URL, используйте общий HTTP-клиент с тайм-аутом и WaitGroup. Сетевая ошибка выводится отдельно от полученного HTTP-кода.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо написать программу, которая одновременно отправляет HTTP‑запросы к двум указанным URL‑адресам и выводит полученные коды статуса ответа для каждого из запросов.
Примерный алгоритм работы:
- Прочитать два URL‑адреса (можно задать их в коде или передать через аргументы командной строки).
- Запустить два запроса параллельно (используя потоки, горутины, async/await или любой иной механизм конкурентного выполнения, поддерживаемый выбранным языком).
- Дождаться завершения обоих запросов.
- Для каждого запроса вывести строку вида
URL: <адрес> – статус: <код>.
Важно обеспечить, чтобы запросы действительно выполнялись одновременно, а не последовательно, и корректно обработать возможные ошибки сети (например, вывести сообщение об ошибке вместо кода статуса).
Ответ
Запустите по горутине на URL, используйте общий HTTP-клиент с тайм-аутом и WaitGroup. Сетевая ошибка выводится отдельно от полученного HTTP-кода.
Полная основа программы:
package main
import (
"fmt"
"net/http"
"sync"
"time"
)
func main() {
urls := []string{"https://example.com", "https://example.org"}
client := &http.Client{Timeout: 5*time.Second}
var wg sync.WaitGroup
for _, url := range urls {
wg.Add(1)
go func(url string) {
defer wg.Done()
resp, err := client.Get(url)
if err != nil { fmt.Printf("URL: %s — ошибка: %v\n", url, err); return }
defer resp.Body.Close()
fmt.Printf("URL: %s — статус: %d\n", url, resp.StatusCode)
}(url)
}
wg.Wait()
}
Порядок строк зависит от завершения запросов. Ответ 404 тоже является полученным HTTP-статусом, а не сетевой ошибкой. Тела здесь не нужны и закрываются без сохранения.