Почему в Golang defer используется после обработки ошибки, а не до?
Например, я часто встречаю следующее использование:
response, err := http.Get(url)
if err != nil {
return nil, err
}
defer response.Body.Close()
но почему бы не сделать так?
response, err := http.Get(url)
defer response.Body.Close()
if err != nil {
return nil, err
}
некоторые линтеры ругаются на подобное, хочу понять почему?
Ответы (1 шт):
Автор решения: RTK
→ Ссылка
Если во время http.Get вернулась ошибка, то response будет равен nil.
В таком случае:
response.Body.Close()вызовет панику, т.к.responseэтоnilи у него нетуBody- Если
responseэтоnil, то нет нужды закрыватьBody, ибо он не создан даже.
Именно из-за этого линтер и ругается, т.к. будет там ошибка или нет станет понятно только при выполнении, но данный код в любом случае "ненадежный" (may have nil or other unexpected value)