Проверяет понимание правильного порядка закрытия тела ответа 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 или веб-скраперов.