🟡 Средний · 2 очк. Стандартная библиотека
Что произойдет, если не вызвать resp.Body.Close() после успешного HTTP-запроса?
A Ничего, GC закроет автоматически
B Утечка TCP-соединения: оно не вернется в пул, и при многих запросах соединения исчерпаются
C Паника при следующем запросе
D Автоматически закроется через 30 секунд
Объяснение вопроса

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()

При утечке соединений:

  • Достигается лимит файловых дескрипторов ОС
  • Новые запросы зависают или возвращают ошибку "too many open files"
  • Сервер видит множество полуоткрытых соединений

Даже если тело не нужно, его надо прочитать и закрыть: io.Copy(io.Discard, resp.Body) + resp.Body.Close(), или просто defer resp.Body.Close() с последующим чтением.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.