Warum gibt dieses Programm im Ergebnis 421 aus?

王林
Freigeben: 2024-02-10 19:48:07
nach vorne
882 Leute haben es durchsucht

Warum gibt dieses Programm im Ergebnis 421 aus?

php-Editor Xiaoxin wird in diesem Artikel eine häufig gestellte Frage für Sie beantworten: „Warum gibt dieses Programm 421 im Ergebnis aus?“ Diese Frage könnte eine bestimmte Logik oder Fehler im Programm beinhalten. Wir helfen Ihnen, dieses Problem zu verstehen und zu lösen, indem wir mögliche Ursachen und Lösungen analysieren. Lesen Sie weiter für detaillierte Antworten.

Frageninhalt

Ich verstehe nicht, warum druckt dieses Programm 421 而不是 431?

package main

import "fmt"

var x int
func f() int {
    x++
    return x
}

func main() {
    o := fmt.println

    defer o(f())
    defer func() {
        defer o(recover())
        o(f())
    }()

    defer f()
    defer recover()

    panic(f())
}
Nach dem Login kopieren

Unten habe ich meinen erratenen Kommentar hinzugefügt:

package main

import "fmt"

var x int
func f() int {
    x++
    return x
}

func main() {
    o := fmt.Println

    defer o(f()) // x=1
    defer func() {
        defer o(recover()) // x=3 from panic (but if we ll execute this program we ll see 2)
        o(f()) // x=4
    }()

    defer f() // x=2
    defer recover() //nil

    panic(f()) // x=3
}
Nach dem Login kopieren

Lösung

defer 确实调用该函数,但它<确实“立即”评估其论点。另外,对 recover() 的调用仅在从延迟函数调用时停止紧急状态(defer receive() erfüllt dieses Kriterium nicht). Siehe Warum fängt „deferrecover()“ keine Panik ab?

Vor diesem Hintergrund: Nummerieren wir die Zeilen:

L1: o := fmt.Println

L2: defer o(f()) // x = 1

L3: defer func() {
L4:     defer o(recover()) // recover() returns 2
L5:     o(f())             // x = 4, it gets printed
L6: }()

L7: defer f() // after panic: x = 3
L8: defer recover()

L9: panic(f()) // x = 2
Nach dem Login kopieren

Der Ausführungsprozess des obigen Codes ist wie folgt:

l2: Auswertung o() 的参数,调用 f()x 递增到 1 (稍后将打印)。 o() wurde noch nicht aufgerufen.

l3: Die verzögerte Funktion wurde noch nicht aufgerufen, ihr gesamter Körper wird vorübergehend übersprungen.

l7: f() 尚未被调用,x 仍为 1.

l8: recover() wird nicht aufgerufen.

l9: Rufen Sie f(),将x递增到2,然后返回,因此2被传递给panic() an.

Wir befinden uns im Panikmodus, also führen Sie jetzt verzögerte Funktionen aus (in Lifo-Reihenfolge).

l8: recover() wird aufgerufen, stoppt den Panikzustand jedoch nicht.

l7: f() 现在被调用,将 x 增加到 3.

l3: Diese anonyme Funktion wird jetzt ausgeführt.

l4: recover() 返回 2 (传递给 panic() 的值),这将稍后打印,但尚未打印,因为对 o() Gibt 2 zurück (den an panic() übergebenen Wert), der später gedruckt wird, aber aufgrund von o() > Der Aufruf von wird zurückgestellt. Der Zustand der Panik endet hier. <p>l5: Rufen Sie <code>f(),将 x 递增到 4 an, um es sofort auszudrucken.

l4: Verzögerungsfunktion o() 现在被执行,打印上面的值 2.

l2: Verzögerungsfunktion o() 现在被执行,打印之前计算的值 1.

Das Programm endet.

Das obige ist der detaillierte Inhalt vonWarum gibt dieses Programm im Ergebnis 421 aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!