Question

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?

Était-ce utile?

La solution

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.

Autres conseils

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top