调用log.Fatalln时是否调用了延迟函数?

11 go exception-safety

db, err := sql.Open("postgres", "…")
if err != nil {
    log.Fatalln(err)
}
defer db.Close()

tpl, err := template.ParseGlob("")
if err != nil {
    log.Fatalln(err)
}
Run Code Online (Sandbox Code Playgroud)

如果template.ParseGlob("")返回错误,db.Close()仍然被调用?

Den*_*ret 17

不,延迟函数不会运行.

这是log.Fatal的描述:

Fatal等效于Print(),然后调用os.Exit(1).

log.Fatal调用os.Exit,其描述是在这里:

退出导致当前程序以给定的状态代码退出.通常,代码零表示成功,非零表示错误.该计划立即终止; 延迟函数不会运行.

示范

如果您确实需要在程序完成之前正确关闭资源或执行某些任务,那么请不要使用log.Fatal.


小智 5

如果您希望考虑延迟函数,请使用“log.Panic”、“log.Panicf”或“log.Panicln”