Heim  >  Artikel  >  Backend-Entwicklung  >  Welche Beziehung besteht zwischen Aufschub und Panik in der Go-Sprache?

Welche Beziehung besteht zwischen Aufschub und Panik in der Go-Sprache?

王林
王林Original
2023-06-11 09:00:08890Durchsuche

Go-Sprache ist eine neue Programmiersprache, die einige einzigartige Syntax und Funktionen hinzugefügt hat, darunter Verzögerung und Panik zwei sehr wichtige Funktionen. In diesem Artikel werden die Beziehung zwischen Verzögerung und Panik in der Go-Sprache sowie deren Verwendung und Eigenschaften vorgestellt.

Verwendung von defer

Die defer-Anweisung in der Go-Sprache wird zum Registrieren einer Funktion verwendet. Wenn die Ausführung dieser Funktion endet oder der aktuelle Bereich endet, wird die registrierte Funktion automatisch ausgeführt. defer kann in mehreren Szenarien verwendet werden, z. B. zur Ressourcenfreigabe, zum Entsperren von Sperren und zur Fehlerbehandlung.

Das Folgende ist ein Beispiel für die verzögerte Freigabe von Ressourcen:

func main() {
    file, err := os.Open("myfile.txt")
  // 在函数结束时,会自动关闭文件
    defer file.Close()
  
    if err != nil {
        fmt.Println("Failed to open file.")
        return
    }
    // ...
}

wird über die Close()-Funktion der Verzögerungsdatei registriert und die Datei wird automatisch geschlossen, wenn die Funktionsausführung endet.

Das Folgende ist ein Beispiel für das Entsperren einer Verzögerungssperre:

func main() {
    var lock sync.Mutex
    lock.Lock()
  // 当函数执行结束时,会自动解锁
    defer lock.Unlock()
  
    // ...
}

Wenn die Funktionsausführung endet, wird die Funktion Unlock() automatisch aufgerufen, um die Sperre zu entsperren.

Die Ausführungsreihenfolge von defer ist von hinten nach vorne, was bedeutet, dass bei der Registrierung mehrerer defer-Anweisungen diese in umgekehrter Reihenfolge ausgeführt werden. Das folgende Beispiel gibt Defer 2 und dann Defer 1 aus. Defer 2,然后输出Defer 1

func main() {
    defer fmt.Println("Defer 1")
    defer fmt.Println("Defer 2")
    fmt.Println("Hello")
}

panic 的用法

Go 语言中的 panic 关键字用于抛出一个异常,并终止当前函数或者程序的执行。 panic 会沿着函数调用堆栈向上传递,直到被 recover() 函数捕捉到为止。如果没有被捕捉到,整个程序会被退出,并输出一个调用堆栈。

下面示例代码中,当输入的字符串长度小于 5 时,会触发 panic,终止程序的执行。

func hello(name string) {
    if len(name) < 5 {
        panic("Name is too short.")
    }
    fmt.Println("Hello", name)
}

func main() {
    hello("Tom")
    hello("Bob")
    hello("me")
}

输出结果如下:

Hello Tom
Hello Bob
panic: Name is too short.

goroutine 1 [running]:
main.hello(...)
    /Users/user/goland/src/main.go:4
main.main()
    /Users/user/goland/src/main.go:10 +0x81
exit status 2

这里我们可以看到当输入的 name 为me

func main() {
    defer fmt.Println("Defer 1")
    defer fmt.Println("Defer 2")
    
    panic("Oops! Something went wrong.")
}

panic-Verwendung

Das Panic-Schlüsselwort in der Go-Sprache wird verwendet, um eine Ausnahme auszulösen und die Ausführung der aktuellen Funktion oder des aktuellen Programms zu beenden. Paniken breiten sich im Funktionsaufrufstapel nach oben aus, bis sie von der Funktion „recover()“ abgefangen werden. Wenn es nicht abgefangen wird, wird das gesamte Programm beendet und ein Aufrufstapel gedruckt.

Wenn im folgenden Beispielcode die Länge der Eingabezeichenfolge weniger als 5 beträgt, wird eine Panik ausgelöst und die Ausführung des Programms wird beendet.

Defer 2
Defer 1
panic: Oops! Something went wrong.

goroutine 1 [running]:
main.main()
    /Users/user/goland/src/main.go:7 +0x81
exit status 2

Das Ausgabeergebnis lautet wie folgt:

func init() {
    fmt.Println("Init 1")
}

func init() {
    fmt.Println("Init 2")
}

func main() {
    defer fmt.Println("Defer 1")
    
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("Recovered:", err)
        }
    }()
    
    defer fmt.Println("Defer 2")
    
    panic("Oops! Something went wrong.")
}

Hier können wir sehen, dass, wenn der Eingabename me ist, eine Panik ausgelöst und die Programmausführung beendet wird.

Zusammenhang zwischen Verzögerung und Panik

Panik hat die Aufgabe, die Programmausführung sofort zu beenden, was bedeutet, dass sie jederzeit ausgelöst werden kann, auch vor dem Ende der Funktionsausführung. Um sicherzustellen, dass das Programm Ressourcen rechtzeitig freigeben und einige notwendige Bereinigungsarbeiten durchführen kann, führt die Go-Sprache den Verzögerungsmechanismus ein, der es der Funktion ermöglicht, vor dem Beenden einige Bereinigungsvorgänge durchzuführen.

Wenn in einer Funktion eine Panik ausgelöst wird, wird diese sofort beendet und alle vor der aktuellen Funktion registrierten Verzögerungsfunktionen werden ausgeführt. Der folgende Beispielcode löst manuell eine Panik aus und führt die Verzögerungsfunktion vor dem Beenden zweimal aus.

Init 1
Init 2
Defer 2
Recovered: Oops! Something went wrong.
Defer 1

Das Ausgabeergebnis lautet wie folgt:

rrreee

Wir können sehen, dass nach dem Auslösen der Panik die beiden Verzögerungsfunktionen in umgekehrter Reihenfolge ausgeführt werden.

Zusätzlich zur Registrierung der Verzögerungsfunktion am Ende der Funktion ermöglicht die Go-Sprache auch die Registrierung mehrerer Verzögerungsfunktionen in der Funktion. Dies bedeutet, dass bei mehreren Verzögerungsfunktionen in einer Funktion die anderen Verzögerungsfunktionen dennoch ausgeführt werden können, auch wenn eine der Verzögerungsfunktionen eine Panik auslöst. 🎜🎜Der folgende Beispielcode zeigt, dass, wenn eine Funktion mehrere Defer-Anweisungen registriert, eine der Defer-Funktionen eine Panik auslöst, die anderen Defer-Funktionen jedoch weiterhin ausgeführt werden. 🎜rrreee🎜Das Ausgabeergebnis lautet wie folgt: 🎜rrreee🎜Wir können sehen, dass die Funktion zuerst zwei Init-Funktionen ausführt und dann nacheinander drei Defer-Funktionen ausführt. Wenn eine der Verzögerungen eine Panik auslöst, aber von einer anderen Verzögerung abgefangen wird und das Programm fortgesetzt wird, werden schließlich beide Verzögerungsfunktionen normal ausgeführt. 🎜🎜In der tatsächlichen Entwicklung werden Verzögerung und Panik häufig paarweise verwendet, um Ressourcen freizugeben und Bereinigungsvorgänge durchzuführen, und Panik wird zur Behandlung von Ausnahmen verwendet. Wenn eine Funktion vor dem Beenden mehrere Bereinigungsvorgänge durchführen muss, können wir am Anfang der Funktion eine Defer-Wrapper-Funktion verwenden und mit der Funktion „recover()“ verhindern, dass die Funktion vorzeitig beendet wird. Diese Schreibweise ist sehr verbreitet und bietet uns eine starke Garantie dafür, robuste Programme zu schreiben. 🎜

Das obige ist der detaillierte Inhalt vonWelche Beziehung besteht zwischen Aufschub und Panik 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