Heim >Backend-Entwicklung >Golang >Was ist die Verwendung von „defer' in der Go-Sprache?

Was ist die Verwendung von „defer' in der Go-Sprache?

王林
王林Original
2021-01-07 15:23:134852Durchsuche

Verwendung von defer in der Go-Sprache: 1. Die defer-Anweisung wird vor der Rückgabe der Funktion oder nach der return-Anweisung in der Funktion ausgeführt. 2. Die Ausführungsreihenfolge mehrerer defer-Anweisungen ist umgekehrt. 3. Die defer-Anweisung wird nach der Panik ausgeführt Anweisung wird nicht ausgeführt.

Was ist die Verwendung von „defer' in der Go-Sprache?

Die Betriebsumgebung dieses Artikels: Windows 10-System, GO 1.11.2, Thinkpad T480-Computer.

(Lernvideo-Sharing: Programmiervideo)

Einführung in die Verwendung:

defer ist eine verzögerte Ausführungsanweisung in der Go-Sprache. Sie wird häufig verwendet, um Code hinzuzufügen, der am Ende der Funktion ausgeführt werden soll um bestimmte zugewiesene Ressourcen freizugeben und die Datenbankverbindung zu schließen, die Verbindung zum Socket zu trennen und eine gesperrte Ressource zu entsperren. Der Go-Sprachmechanismus garantiert, dass der Code in der Defer-Anweisung ausgeführt wird.

Es gibt ähnliche Mechanismen in anderen Sprachen, wie zum Beispiel die „final“-Anweisung in Java und C#, und der Destruktor (Destruktor) in der Sprache C++ kann eine ähnliche Rolle spielen. Der C++-Sprachmechanismus garantiert, dass die Zerstörung ausgeführt wird, bevor das Objekt zerstört wird .Code in der Funktion. Der Destruktor in C++ zerstört das Objekt und der Defer in Go zerstört die Funktion.

1. Ausführungszeitpunkt der Defer-Anweisung

Die Defer-Anweisung wird ausgeführt, bevor die Funktion zurückkehrt oder nach der Return-Anweisung in der Funktion (die Return-Anweisung ruft möglicherweise eine andere Funktion auf). Beispielcode:

package main
 
import (
    "fmt"
)
 
func main() {
    fmt.Println(deferReturn())
}
 
func deferReturn() (ret int) {
    defer func() {
        ret++
    }()
    return 10
}

Der vom obigen Code gedruckte Wert ist: 11. Die Defer-Anweisung „ret++“ in der anonymen Funktion addiert 1 zum Rückgabewert 10 und ergibt 11. Schauen wir uns den Code an, in dem nach der Return-Anweisung eine Defer-Anweisung erscheint:

func returnDefer() (ret int) {
    return 0
    defer func() {
        ret++
        ret++
    }()
    return 1
}

Der Rückgabewert der obigen returnDefer-Funktion ist: 0. Der Grund dafür ist, dass die Defer-Anweisung zurückkehrt, bevor Code hinzugefügt und die Funktion „return 0“ ausgeführt wird, sodass die Defer-Anweisung nicht ausgeführt wird.

2. Die Ausführungsreihenfolge mehrerer Defer-Anweisungen ist umgekehrt.

Wenn mehrere Defer-Anweisungen angezeigt werden, werden sie in umgekehrter Reihenfolge ausgeführt (ähnlich einem Stapel, d. h. der letzte rein, der zuerst raus). Beispielcode:

func deferSample() {
    for i := 0; i < 5; i++ {
        defer fmt.Printf("%d ", i)
    }
}

Der obige Code gibt Folgendes aus: 4 3 2 1 0

3. defer und panic

1. Die defer-Anweisung nach der panic-Anweisung wird nicht ausgeführt

Beispielcode:

func panicDefer() {
    panic("panic")
    defer fmt.Println("defer after panic")
}

Ausgabe des Obigen Code Wie folgt:

panic: panic
goroutine 1 [running]:
main.panicDefer()
    E:/godemo/testdefer.go:17 +0x39
main.main()
    E:/godemo/testdefer.go:13 +0x20
Process finished with exit code 2

Sie können sehen, dass die Defer-Anweisung nicht ausgeführt wird.

2. Die Defer-Anweisung vor der Panic-Anweisung wird ausgeführt

Beispielcode:

func deferPanic() {
    defer fmt.Println("defer before panic")
    panic("panic")
}

Die Ausgabe des obigen Codes lautet wie folgt:

defer before panic
panic: panic
goroutine 1 [running]:
main.deferPanic()
    E:/godemo/testdefer.go:19 +0x95
main.main()
    E:/godemo/testdefer.go:14 +0x20
Process finished with exit code 2

Die Defer-Anweisung gibt den Inhalt aus.

Panic in Go ähnelt dem Auslösen von Ausnahmen in anderen Sprachen. Der Code nach Panic wird nicht mehr ausgeführt (die Defer-Anweisung wird vor der Panic-Anweisung ausgeführt).

4. Die Implementierungslogik der Rückgabe

1 Der erste Schritt besteht darin, dem Rückgabewert einen Wert zuzuweisen (wenn der benannte Rückgabewert zuerst deklariert und dann zugewiesen wird); Der zweite Schritt besteht darin, die RET-Rückgabeanweisung aufzurufen und als Rückgabewert zu übergeben. RET prüft, ob eine Defer-Anweisung vorhanden ist, und fügt die Defer-Anweisung in umgekehrter Reihenfolge ein.
3 mit dem Rückgabewert.

Es ist ersichtlich, dass die Rückgabe keine atomare Operation ist und der Rückgabewert der Funktion nicht unbedingt mit dem Rückgabewert von RET übereinstimmt.

5. Die Reihenfolge von Verzögerung, Rückgabe und Rückgabewert ist: Rückgabe weist zuerst dem Rückgabewert einen Wert zu; dann beginnt Verzögerung mit der Ausführung der RET-Anweisung trägt den Rückgabewert Exit-Funktion.

Verwandte Empfehlungen:

Golang-Tutorial

Das obige ist der detaillierte Inhalt vonWas ist die Verwendung von „defer' in der Go-Sprache?. 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