Как установить таймаут в HTTP запросе

«Как установить таймаут в HTTP запросе» — вопрос из категории Сети, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go можно установить таймаут для HTTP запроса через context или http.Client.

1. Через контекст:

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

req, _ := http.NewRequestWithContext(ctx, "GET", "https://example.com", nil)
resp, err := http.DefaultClient.Do(req)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

2. Через http.Client:

client := &http.Client{
    Timeout: 5 * time.Second, // Общий таймаут на запрос + чтение тела
}
resp, err := client.Get("https://example.com")
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

Важно:

  • http.Client.Timeout включает весь запрос (DNS, соединение, передачу данных).
  • Если нужны раздельные таймауты (например, на подключение и чтение), используй http.Transport.
  • Контекст позволяет гибко управлять таймаутами в рамках горутин.