Heim  >  Artikel  >  Backend-Entwicklung  >  Wann wird das Schlüsselwort „defer“ in Golang wirksam?

Wann wird das Schlüsselwort „defer“ in Golang wirksam?

王林
王林Original
2019-12-09 14:55:392688Durchsuche

Wann wird das Schlüsselwort „defer“ in Golang wirksam?

In Golang verwenden wir die Defer-Anweisung, um einige Fehlerbehandlungs- und Abschlussarbeiten durchzuführen. Ihre Funktion ähnelt dem Schlüsselwort „final“ in Java. Unabhängig davon, ob es sich um das Schlüsselwort „final“ von Java oder die Klasse „Raii“ von C++ handelt, können wir deren Umfang und Ausführungszeitpunkt eindeutig kennen. Wann wird der Inhalt also durch das Schlüsselwort „defer“ in Golang ausgeführt?

Zunächst heißt es in der offiziellen Dokumentation: Defer wird ausgeführt, wenn die Funktion zurückkehrt, die Funktion endet oder die entsprechende Goroutine in Panik gerät.

Dann ist zu beachten, dass der Rückgabewert vor der Rückgabe auf den Stapel verschoben wird, da Golang mehrwertige Rückgaben unterstützt, während die Sprache C den Rückgabewert in einem Register speichert und zurückgibt.

Wenn Golang zurückkehrt, legt es zuerst den Rückgabewert auf den Stapel und führt dann die Verzögerungsfunktion aus. Wenn der Rückgabewert im Stapel in der Verzögerungsfunktion geändert wird (dies sollte jedoch nicht erfolgen). , dann wird der Rückgabewert geändert ; Dann zurückspringen.

Auf diese Weise erfahren wir den Zeitpunkt der verzögerten Ausführung. Auch wenn Sie „defer“ weit vor „return“ schreiben, wird es dennoch ausgeführt, bevor die Funktion zurückkehrt.

Wenn in einem Bereich mehrere Verzögerungen vorhanden sind, besteht die Ausführungsreihenfolge vor der Rückkehr darin, zuerst die später aufgerufene Verzögerung und dann die früher aufgerufene Verzögerung auszuführen.

Es gibt mehrere Beispiele in den offiziellen Dokumenten, die den Zeitpunkt der Verschiebung gut veranschaulichen können, wie folgt:

lock(l)
defer unlock(l)  // unlocking happens before surrounding function returns

// prints 3 2 1 0 before surrounding function returns
for i := 0; i <= 3; i++ {
    defer fmt.Print(i)
}

// f returns 1
func f() (result int) {
    defer func() {
        result++
    }()
    return 0
}

Empfohlene verwandte Artikel und Tutorials: Golang-Tutorial

Das obige ist der detaillierte Inhalt vonWann wird das Schlüsselwort „defer“ in Golang wirksam?. 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
Vorheriger Artikel:Wozu dient die Golang-Karte?Nächster Artikel:Wozu dient die Golang-Karte?