Что будет, если не закрыть resp.Body после ошибки в Go?

В HTTP-клиенте Go тело ответа (resp.Body) необходимо закрывать, чтобы освободить занятые ресурсы Если этого не сделать, возможны утечки памяти и исчерпание файловых дескрипторов Кроме того, соединение в пуле…

Короткий ответ

Что ответить на собеседовании

В HTTP-клиенте Go тело ответа (resp.Body) необходимо закрывать, чтобы освободить занятые ресурсы Если этого не сделать, возможны утечки памяти и исчерпание файловых дескрипторов Кроме того, соединение в пуле HTTP-клиента может оказаться заблокированным Из-за нехватки доступных соединений последующие запросы начнут выполняться медленнее или завершаться с ошибкой Рекомендуемая практика — вызвать defer resp.Body.Close() сразу после проверки ошибки Закрывать тело ответа следует даже в случае ошибки его чтения, поскольку это освобождает ресурсы Принудительное закрытие обеспечивает правильное управление сетевыми ресурсами и поддерживает…

Подробный разбор

Ответ с пояснениями

Что будет, если не закрыть resp.Body после ошибки в Go?

  • В HTTP-клиенте Go тело ответа (resp.Body) необходимо закрывать, чтобы освободить занятые ресурсы
  • Если этого не сделать, возможны утечки памяти и исчерпание файловых дескрипторов
  • Кроме того, соединение в пуле HTTP-клиента может оказаться заблокированным
  • Из-за нехватки доступных соединений последующие запросы начнут выполняться медленнее или завершаться с ошибкой
  • Рекомендуемая практика — вызвать defer resp.Body.Close() сразу после проверки ошибки
  • Закрывать тело ответа следует даже в случае ошибки его чтения, поскольку это освобождает ресурсы
  • Принудительное закрытие обеспечивает правильное управление сетевыми ресурсами и поддерживает стабильность приложения

Итог: обязательное закрытие resp.Body помогает избежать утечек и проблем с соединениями.

Подробный ответ

Основной ответ

После выполнения HTTP-запроса в Go необходимо закрывать resp.Body. Иначе возникает утечка ресурсов: тело ответа представляет собой открытый поток (connection) к серверу, который требуется освободить. В противном случае соединение не закроется и не вернётся в пул, что способно исчерпать допустимое число одновременных соединений и ухудшить производительность приложения.

Ключевые моменты

  • Ресурсы операционной системы — каждое открытое HTTP-соединение использует file descriptors, количество которых в итоге может оказаться исчерпано.
  • HTTP Keep-Alive и connection pooling — для эффективной работы пула соединений тело ответа обязательно закрывают; без этого соединения нельзя будет повторно использовать.
  • Память и утечки — незакрытый resp.Body способен вызвать утечку памяти и повысить расход ресурсов, особенно при большом числе запросов.

Практический контекст

В Go-проектах, использующих, например, net/http клиент версии 1.17+, принято всегда вызывать defer resp.Body.Close() непосредственно после проверки ошибки запроса. Такой подход освобождает ресурсы и сохраняет стабильность HTTP-клиента при ошибках и интенсивной сетевой активности. Если пренебречь этим правилом, часто появляются ошибки "too many open files" и "connection reset".

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку