Heim  >  Artikel  >  Backend-Entwicklung  >  Ausnahmebehandlungsmethode des Schlüsselworts „defer“ in der Golang-Funktion

Ausnahmebehandlungsmethode des Schlüsselworts „defer“ in der Golang-Funktion

WBOY
WBOYOriginal
2023-05-17 08:22:571658Durchsuche

Golang ist eine relativ junge Open-Source- und Hochleistungsprogrammiersprache. Eines ihrer Merkmale ist das Schlüsselwort defer von Funktionen. Mit diesem Schlüsselwort können wir einige erforderliche Vorgänge vor dem Ende der Funktion ausführen, z. B. Ressourcenbereinigung, Protokollausgabe usw. Es kann auch zur Behandlung von Ausnahmen verwendet werden, wodurch unser Code robuster und zuverlässiger wird. In diesem Artikel wird die Anwendung des Schlüsselworts defer der Golang-Funktion bei der Ausnahmebehandlung eingehend untersucht, damit die Leser diese Funktion geschickter nutzen können.

1. So verwenden Sie defer

In Golang kann das Schlüsselwort defer verwendet werden, um einen Funktionsaufruf zu definieren, der nach Beendigung der Funktion ausgeführt wird. Das Besondere an Defer ist, dass es ausgeführt wird, bevor die Funktion zurückkehrt, unabhängig davon, ob mitten in der Funktion eine Ausnahme auftritt. Zum Beispiel:

func demo() {
    defer fmt.Println("defer end.")
    fmt.Println("normal flow.")
}

Im obigen Code wird die Druckanweisung „normaler Ablauf“ vor der Verzögerungsanweisung „defer fmt.Println(„defer end.“)“ ausgeführt.

Wenn außerdem mehrere Defer-Anweisungen in einer Funktion verwendet werden, befindet sich deren Ausführungsreihenfolge auf dem Stapel, und die später definierte Defer-Anweisung wird zuerst ausgeführt. Zum Beispiel:

func demo() {
    defer fmt.Println("defer 1.")
    defer fmt.Println("defer 2.")
    fmt.Println("normal flow.")
}

Im obigen Code wird zuerst die Anweisung „normaler Fluss“ gedruckt, dann „aufschieben 2.“ und schließlich „aufschieben 1.“

2. Ausnahmebehandlung aufschieben

Zusätzlich zur normalen Verwendung kann „Aufschieben“ auch zur Behandlung von Ausnahmen im Code verwendet werden. Eine Ausnahme ist ein Fehler, der während der Programmausführung auftritt. Dies kann viele Ursachen haben, beispielsweise illegale Eingaben, logische Fehler oder Systemfehler. In Golang können wir Ausnahmen über die drei Schlüsselwörter panic/defer/recover behandeln. Unter anderem führt „Panic“ zu einer Ausnahme; „Recover“ fängt die Ausnahme ab und behandelt sie; „Defer“ führt einige notwendige Bereinigungsvorgänge aus, nachdem die Ausnahme behandelt wurde. Das Folgende ist ein praktisches Beispiel, um die Verwendung von Panic/Defer/Recover zu veranschaulichen:

func catchError() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("recovered from: ", err)
        }
    }()
    fmt.Println("start")
    panic("error occurs!")
    fmt.Println("end")
}

Im obigen Code rufen wir eine Funktion CatchError auf, geben zuerst die Anweisung „start“ aus und verwenden dann Panic, um eine Ausnahme und Ausgabe auszulösen „Fehler tritt auf!“ Zu diesem Zeitpunkt unterbricht das Programm die durch die CatchError-Funktion definierte Verzögerung und tritt ein. In dieser Verzögerung gibt es eine if-Anweisung, um zu bestimmen, ob derzeit eine Ausnahme abgefangen wird. Wenn eine Ausnahme abgefangen wird, wird fmt.Println aufgerufen und „wiederhergestellt von:“ und die Ausnahmeinformation err wird ausgegeben.

Dieses Beispiel zeigt, dass die Schlüsselwörter panic/defer/recover von Golang verwendet werden können, um das Programm entsprechend zu behandeln, wenn eine Ausnahme in der Funktion auftritt. Da das Schlüsselwort defer unter allen Umständen ausgeführt wird, können wir defer verwenden, um einige notwendige Bereinigungsvorgänge durchzuführen, wenn im Programm eine Ausnahme auftritt, z. B. das Schließen von Dateien, das Freigeben von Ressourcen usw.

3. Hinweise zu defer

Wenn wir das Schlüsselwort defer verwenden, müssen wir auf die folgenden Punkte achten:

  1. Bei defer in einer Schleifenstruktur muss besonderes Augenmerk auf den Zeitpunkt der Ausführung gelegt werden.
func testLoop() {
    for i := 0; i < 5; i++ {
        defer fmt.Println("defer: ",i)
    }
    fmt.Println("test loop done.")
}

Im obigen Code verwenden wir eine Schleifenstruktur zum Aufschieben von Tests. Wir möchten, dass die Defer-Anweisung am Ende jeder Schleife zuerst ausgeführt wird, damit wir die in der Schleife verwendeten Ressourcen freigeben können. Da die Defer-Anweisung im obigen Code jedoch in LIFO ausgeführt wird (last in first out), geben wir schließlich „Testschleife fertig“ anstelle von „defer: 4, defer: 3, ..., defer: 0“ aus „Wie kann man es lösen? Eine Möglichkeit besteht darin, den Code wie folgt zu ändern:

func testLoop() {
    for i := 0; i < 5; i++ {
        defer func(i int) {
            fmt.Println("defer: ", i)
        }(i)
    }
    fmt.Println("test loop done.")
}

Auf diese Weise wird der Defer-Anweisung ein Abschluss hinzugefügt und der aktuelle i-Wert direkt an die Abschlussfunktion übergeben, damit diese bei späterer Ausführung den richtigen Wert aufrufen kann. Wie Sie sehen können, haben wir nach der Änderung des Codes erfolgreich „Testschleife fertig“ und „defer: 4, defer: 3, ..., defer: 0“ ausgegeben.

  1. Bei der Verwendung von Defer müssen wir auch auf die damit verbundenen Auswirkungen auf die Leistung achten. Denn jede Defer-Anweisung erhöht den Overhead des Programms. Daher sollte die Häufigkeit der Verwendung von „defer“ in einem Programm oder einer Funktion innerhalb eines angemessenen Bereichs kontrolliert werden, um eine Beeinträchtigung der Leistung des Programms zu vermeiden.
  2. Versuchen Sie nicht, die Parameter in der Defer-Anweisung zu ändern, da sie bei ihrer Definition berechnet werden. In diesem Fall kann es zu unerwarteten Ergebnissen kommen.
  3. Wenn die Schlüsselwort-Defer-Anweisung die Go-Funktion enthält, wird die Goroutine am Ende der Funktionsausführung aufgerufen und hat keinen Einfluss auf die Ausführung der Hauptfunktion.

4. Zusammenfassung

In Golang ist das Schlüsselwort defer eine sehr wichtige Funktion. Es kann zum Ausführen von Funktionsbereinigungsvorgängen verwendet werden, z. B. zum Schließen von Dateien, zum Freigeben von Ressourcen usw. Wenn in einer Funktion eine Ausnahme auftritt, kann die Defer-Anweisung außerdem eine bestimmte Rolle beim Abfangen und Behandeln von Ausnahmen spielen. Bei der Verwendung von Defer müssen wir dessen Verwendung beherrschen und auf entsprechende Vorsichtsmaßnahmen achten, um diese Funktion bei der Programmentwicklung voll nutzen zu können und unser Programm robuster und zuverlässiger zu machen.

Das obige ist der detaillierte Inhalt vonAusnahmebehandlungsmethode des Schlüsselworts „defer“ in der Golang-Funktion. 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