Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Node.js: defer, resp.Body.Close, HTTP, Go, error handling

Как корректно разместить defer resp.Body.Close() относительно проверки ошибки при HTTP-запросе?

Проверяет понимание правильного порядка закрытия тела ответа HTTP и обработки ошибок в Go.

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

В Go при выполнении HTTP-запроса необходимо сначала проверить ошибку, возвращаемую функцией http.Get или http.Post, и только после этого использовать defer resp.Body.Close(). Если вызвать defer до проверки ошибки, то при ошибке resp будет nil, и вызов метода Close на nil приведет к панике. Правильный порядок: resp, err := http.Get(url); if err != nil { return err }; defer resp.Body.Close().

Длинный ответ

Правильный порядок закрытия тела ответа HTTP в Go

При выполнении HTTP-запроса в Go с помощью пакета net/http, функция http.Get (или http.Post) возвращает два значения: указатель на http.Response и ошибку. Важно правильно обработать ошибку перед тем, как использовать defer для закрытия тела ответа.

Почему порядок важен?

Если вызвать defer resp.Body.Close() до проверки ошибки, то в случае, когда запрос завершился ошибкой (например, сетевой сбой), переменная resp будет равна nil. Вызов метода Close на nil-указателе вызовет панику (panic), так как Go не позволяет вызывать методы на nil-значениях.

Правильный подход

Сначала выполните запрос, затем проверьте ошибку. Если ошибка есть, верните её или обработайте. Только после этого используйте defer для закрытия resp.Body.

resp, err := http.Get("https://example.com")
if err != nil {
    // Обработка ошибки, например, возврат
    return err
}
defer resp.Body.Close()

// Далее работаем с resp.Body
body, err := io.ReadAll(resp.Body)
if err != nil {
    return err
}
fmt.Println(string(body))

Пример с обработкой ошибки

В этом примере сначала проверяется ошибка, и только потом закрывается тело ответа. Это гарантирует, что resp не nil, и вызов Close безопасен.

Вывод

Всегда проверяйте ошибку HTTP-запроса перед использованием defer для закрытия resp.Body. Это предотвращает панику и делает код надёжным. Данный подход применяется во всех случаях работы с HTTP-запросами в Go, особенно при написании клиентов API или веб-скраперов.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • Node.js

    Node.js

Ключевые слова

#defer

#resp.Body.Close

#HTTP

#Go

#error handling

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.