http.DefaultClient создается с нулевыми значениями - в частности, без Timeout. Это значит, что запрос к зависшему серверу будет ждать бесконечно, блокируя горутину и соединение.
// Опасно в production:
resp, err := http.Get(url) // использует DefaultClient без таймаута
// Правильно:
client := &http.Client{
Timeout: 10 * time.Second,
Transport: &http.Transport{
MaxIdleConns: 100,
MaxIdleConnsPerHost: 10,
IdleConnTimeout: 90 * time.Second,
},
}
resp, err := client.Get(url)
Что настраивается в своем клиенте:
Timeout - общий таймаут запроса (включая чтение тела)Transport - пул соединений, TLS, проксиCheckRedirect - политика перенаправленийJar - cookie jar