Ответ
В 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. - Контекст позволяет гибко управлять таймаутами в рамках горутин.