Heim >Backend-Entwicklung >Golang >Werden „Defer'-Funktionen nach einem „log.Fatalln()'-Aufruf in Go ausgeführt?

Werden „Defer'-Funktionen nach einem „log.Fatalln()'-Aufruf in Go ausgeführt?

Barbara Streisand
Barbara StreisandOriginal
2024-12-07 19:44:14433Durchsuche

Will `defer` functions execute after a `log.Fatalln()` call in Go?

Verzögerte Funktionen und log.Fatalln()-Aufrufe

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:

  • log.Fatalln() entspricht log.Print() gefolgt von os.Exit(1).
  • os.Exit() bewirkt, dass das Programm Beenden Sie mit dem angegebenen Statuscode (in diesem Fall 1 für Fehler).
  • Verzögerte Funktionen (z. B. db.Close()) werden nicht ausgeführt, wenn os.Exit() ausgeführt wird aufgerufen.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn