Вопрос проверяет понимание различий между простым HTTP-запросом и контекстно-управляемым запросом в Go, что важно для написания надежного и контролируемого сетевого кода.
http.Get — это удобная функция для быстрого выполнения GET-запроса. Она не принимает контекст, поэтому вы не можете отменить запрос или установить тайм-аут. Внутри она использует http.DefaultClient и не дает возможности настроить клиент.
http.NewRequestWithContext создает объект запроса с привязанным контекстом. Контекст позволяет контролировать выполнение: отменить запрос, установить дедлайн или передать значения. Затем запрос выполняется через метод Do конкретного клиента, что дает гибкость в настройке тайм-аутов, переиспользовании соединений и т.д.
// Простой запрос без контроля
resp, err := http.Get("https://example.com")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
// Запрос с контекстом и тайм-аутом
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
req, err := http.NewRequestWithContext(ctx, "GET", "https://example.com", nil)
if err != nil {
log.Fatal(err)
}
client := &http.Client{Timeout: 10 * time.Second}
resp, err = client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()http.Get подходит для быстрых скриптов или тестов, где не нужен контроль.http.NewRequestWithContext обязателен в продакшн-коде, где важны тайм-ауты, отмена запросов и управление ресурсами.Вывод: используйте http.NewRequestWithContext для надежных и контролируемых HTTP-запросов, особенно в сервисах с высокой нагрузкой или требованием к отказоустойчивости.