Log.Fatalln et exécution de fonctions différées
Dans les programmes Go, les fonctions différées sont automatiquement appelées au retour de la fonction englobante. Cependant, une question courante se pose : les fonctions différées sont-elles exécutées lorsque la fonction log.Fatalln est invoquée ?
Comprendre log.Fatalln
La fonction log.Fatalln est membre du package de journalisation Go standard. Il enregistre le message fourni, puis appelle immédiatement os.Exit(1) pour terminer le programme. La fonction os.Exit, à son tour, empêche l'exécution de toute fonction différée.
Exécution de fonction différée en cas de log.Fatalln
Par conséquent, la réponse à la question la question est non. Les fonctions différées ne sont pas exécutées lorsque log.Fatalln est appelé. En effet, log.Fatalln termine brusquement le programme, en contournant l'exécution des fonctions différées.
Ce comportement est documenté dans la description de log.Fatal, la fonction équivalente à log.Fatalln :
Fatal is equivalent to Print() followed by a call to os.Exit(1).
Démonstration pratique
Le code suivant le démontre comportement :
db, err := sql.Open("postgres", "…") if err != nil { log.Fatalln(err) } defer db.Close() tpl, err := template.ParseGlob("") if err != nil { log.Fatalln(err) }
Si template.ParseGlob("") renvoie une erreur, l'appel à db.Close() ne sera pas exécuté car log.Fatalln terminera le programme avant d'atteindre cette ligne.
Approche alternative
Si vous devez vous assurer que les tâches de nettoyage sont effectuées avant la fin du programme, vous devriez envisager d'utiliser d'autres fonctions de journalisation, telles que log.Print ou log.Println, qui ne terminent pas le programme.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!