http.Transport — нижний уровень HTTP-клиента в Go. Он управляет пулом соединений, TLS, прокси, таймаутами на уровне соединения. Когда ты делаешь http.Get(), под капотом работает DefaultTransport.
transport := &http.Transport{
MaxIdleConns: 100,
MaxIdleConnsPerHost: 10,
IdleConnTimeout: 90 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
}
client := &http.Client{
Transport: transport,
Timeout: 30 * time.Second,
}
Transport переиспользует TCP-соединения (keep-alive) — это критично для производительности. Если не читать Body до конца и не закрывать его, соединение не вернётся в пул и будет утечка. MaxIdleConnsPerHost по умолчанию 2, что мало для высоконагруженных сервисов — увеличивай. Transport потокобезопасен и должен быть один на приложение, а не создаваться на каждый запрос.