LINUX.ORG.RU

defer

 


1

3

Привет, немного запутался, прошу пояснить. Я пишу всегда так

func main() {
    f, err := os.Open("file.txt")
    if err != nil {...}
    defer f.Close()
}
товарищ говорит что defer нужно инициализировать раньше
func main() {
    f, err := os.Open("file.txt")
    defer f.Close()
    if err != nil {...}
}
Объясните, плиз, в чем разница (я не заметил) и все же как правильно надо? Везде, где я лазил по чужому коду, делают как в первом случае.

★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

Товарищ говорит неправильно. В случае ошибки тебе нечего закрывать, т.к. ничего не было открыто.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 2)

В первом случае при ошибке (err != nil) defer не будет выполняться, во втором - будет. В случае с os.Open, ЕМНИП, нужен именно первый случай.

Deleted
()
Ответ на: комментарий от Deleted

Ну os.Open это синтетический пример. Просто общая стилистика у меня везде одинаковая.

dnb ★★★★
() автор топика
Ответ на: комментарий от buddhist

Где там это написано? Там совсем о другом. В частности:

Плохо:

a, err := os.Open(A)
if err != nil { return } // закрывать нечего, а не открыт

b, err := os.Open(B)
if err != nil { return } // на этом этапе a останется открытым, b не открыт

defer a.Close()
defer b.Close()

// ...

return // закрой a и b

vs. хорошо:

a, err := os.Open(A)
if err != nil { return } // закрывать нечего, а не открыт
defer a.Close()

b, err := os.Open(B)
if err != nil { return } // закрой a, b не октрыт
defer b.Close()

// ...

return // закрой a и b

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 2)
Ответ на: комментарий от phoenix

Нет, там проверка на nil:

   128	func (f *File) Close() error {
   129		if f == nil {
   130			return ErrInvalid
   131		}
   132		return f.file.close()
   133	}
Я за второй вариант.
Если в if err != nil {...} вызывается os.Exit(), то все равно, что не сработает defer f.Close().

Smola
()
Ответ на: комментарий от Smola

Ну это конкретно сработает, а в другом случае проверки не будет или будет value receiver и приехали

phoenix ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.