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