Вызывают ли отложенные функции при вызове log.Fatalln?
db, err := sql.Open("postgres", "…")
if err != nil {
log.Fatalln(err)
}
defer db.Close()
tpl, err := template.ParseGlob("")
if err != nil {
log.Fatalln(err)
}
Если template.ParseGlob("")
возвращает ошибку, есть db.Close()
все еще звонят?
2 ответа
Решение
Нет, отложенные функции не запускаются.
Вот описание log.Fatal:
Fatal эквивалентен Print(), за которым следует вызов os.Exit(1).
log.Fatal
звонки os.Exit
, чье описание здесь:
Выход вызывает выход текущей программы с заданным кодом состояния. Обычно нулевой код указывает на успех, ненулевой - на ошибку. Программа заканчивается немедленно; отложенные функции не запускаются.
Если вам действительно нужно правильно закрыть ресурсы или выполнить некоторые задачи до завершения программы, не используйте log.Fatal
,
Если вы хотите, чтобы учитывались отложенные функции, используйте "log.Panic", "log.Panicf" или "log.Panicln"