Почему в 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. В таком случае:

  1. response.Body.Close() вызовет панику, т.к. response это nil и у него нету Body
  2. Если response это nil, то нет нужды закрывать Body, ибо он не создан даже.

Именно из-за этого линтер и ругается, т.к. будет там ошибка или нет станет понятно только при выполнении, но данный код в любом случае "ненадежный" (may have nil or other unexpected value)

→ Ссылка