質問

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

tpl, err := template.ParseGlob("")
if err != nil {
    log.Fatalln(err)
}

If template.ParseGlob("") returns an error, is db.Close() still being called?

役に立ちましたか?

解決

No, the deferred functions aren't run.

Here's the description of log.Fatal :

Fatal is equivalent to Print() followed by a call to os.Exit(1).

log.Fatal calls os.Exit, whose description is here :

Exit causes the current program to exit with the given status code. Conventionally, code zero indicates success, non-zero an error. The program terminates immediately; deferred functions are not run.

Demonstration

If you really need to properly close resources or do some tasks before the program finishes, then don't use log.Fatal.

他のヒント

If you want deferred functions to be considered use "log.Panic", "log.Panicf" or "log.Panicln"

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top