Выбор ответа Middle net/http и middleware спрашивают часто обновлено
Зачем закрывать resp.Body
Вопрос
Что будет, если в HTTP-клиенте забывать resp.Body.Close()?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Соединения не вернутся в пул: утекут сокеты и горутины. Транспорт может переиспользовать соединение только после того, как тело прочитано до конца и закрыто.
Варианты ответа
- Ничего, тело закроет финализатор при сборке мусора
- Соединения не вернутся в пул: утекут сокеты и горутиныправильный ответ
- Следующий запрос к тому же хосту упадёт с panic
- Ответ не будет прочитан: Body пустой до вызова Close
Разбор
Транспорт может переиспользовать соединение только после того, как тело прочитано до конца и закрыто. Без Close каждое соединение висит, транспорт открывает новые, растут число сокетов и горутин чтения и записи, со временем too many open files. Финализатор на это не рассчитан, паники нет, а тело читается и без Close.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Rate limiter на токен-бакете для middleware на Go
Следующий вопрос
Таймаут http.DefaultClient
Термины по теме
Ещё по теме «net/http и middleware»
- Статистика access-логов: ошибки и p95 на Go
- Разбор сырого HTTP/1.1 запроса на Go
- Разбор query-строки URL с декодированием на Go
- Маршрутизатор с параметрами пути в стиле ServeMux
- Обработчики net/http и горутины
- http.HandlerFunc
- Надёжный HTTP-клиент в Go
- HTTP-сервис на стандартной библиотеке