Problem:
Bedenken Sie den folgenden Go-Code:
db, err := sql.Open("postgres", "…") if err != nil { log.Fatalln(err) } defer db.Close() tpl, err := template.ParseGlob("") if err != nil { log.Fatalln(err) }
Wenn template.ParseGlob("") einen Fehler zurückgibt, wird die Funktion db.Close() ausgeführt aufgerufen werden?
Antwort:
Nein, die verzögerten Funktionen werden in diesem Szenario nicht ausgeführt.
Erklärung:
log.Fatalln() ist eine Protokollierungsfunktion, die eine Fehlermeldung ausgibt und dann os.Exit(1) aufruft. das Programm sofort zu beenden. Hier ist eine Aufschlüsselung:
Wenn im Codeausschnitt der Aufruf von template.ParseGlob("") fehlschlägt und log.Fatalln() ausgelöst wird, wird das Programm sofort beendet. Infolgedessen wird die verzögerte Funktion db.Close() nicht ausgeführt, wodurch möglicherweise die Datenbankverbindung offen bleibt.
Demonstration:
Um dieses Verhalten zu veranschaulichen, wird die Der folgende Code kann ausgeführt werden:
package main import ( "log" "os" ) func main() { defer os.Exit(1) // Exit the program with status code 1 log.Fatalln("Program terminated early") }
Das Ausführen dieses Codes führt dazu, dass die Fehlermeldung protokolliert wird und das Programm sofort beendet wird, ohne dass verzögerte Funktionen ausgeführt werden ausgeführt.
Vermeidung:
Um Probleme mit nicht ordnungsgemäß geschlossenen Ressourcen oder nicht behandelten Aufgaben zu vermeiden, sollten Sie log.Println() für die Fehlerprotokollierung und die ordnungsgemäße Behandlung von Fehlern verwenden, ohne die zu beenden Programm.
Das obige ist der detaillierte Inhalt vonWerden „Defer'-Funktionen nach einem „log.Fatalln()'-Aufruf in Go ausgeführt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!