Heim > Artikel > Backend-Entwicklung > 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.
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()) }
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 }
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
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!