Maison >développement back-end >Golang >Les fonctions « defer » s'exécuteront-elles après un appel « log.Fatalln() » dans Go ?
Problème :
Considérez le code Go suivant :
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, le La fonction db.Close() sera-t-elle appelée ?
Réponse :
Non, les fonctions différées ne seront pas exécutées dans ce scénario.
Explication :
log.Fatalln() est une fonction de journalisation qui imprime un message d'erreur puis appelle os.Exit(1) pour terminer le programme immédiatement. Voici une répartition :
Dans l'extrait de code, si l'appel à template.ParseGlob("") échoue et que log.Fatalln() est déclenché, le programme se terminera immédiatement. En conséquence, la fonction différée db.Close() ne sera pas exécutée, laissant potentiellement la connexion à la base de données ouverte.
Démonstration :
Pour illustrer ce comportement, le le code suivant peut être exécuté :
package main import ( "log" "os" ) func main() { defer os.Exit(1) // Exit the program with status code 1 log.Fatalln("Program terminated early") }
L'exécution de ce code entraînera la journalisation du message d'erreur et la fermeture immédiate du programme, sans qu'aucune fonction différée ne soit exécuté.
Évitement :
Pour éviter les problèmes liés à des ressources mal fermées ou à des tâches non gérées, envisagez d'utiliser log.Println() pour la journalisation des erreurs et la gestion des erreurs avec élégance sans mettre fin au 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!