http.Client использует пул TCP-соединений (keep-alive). После получения ответа соединение возвращается в пул только если resp.Body полностью прочитан и закрыт.
// Правильно:
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
// Неправильно - утечка соединения:
resp, _ := http.Get(url)
// забыли resp.Body.Close()
При утечке соединений:
Даже если тело не нужно, его надо прочитать и закрыть: io.Copy(io.Discard, resp.Body) + resp.Body.Close(), или просто defer resp.Body.Close() с последующим чтением.