Вызывают ли отложенные функции при вызове 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"

Другие вопросы по тегам