php エディターの Xiaoxin が、この記事でよくある質問に答えます。「なぜこのプログラムは結果に 421 を出力するのですか?」この質問には、プログラム内の何らかの特定のロジックやエラーが含まれる可能性があります。エラー。考えられる原因と解決策を分析することで、この問題の理解と解決をお手伝いします。詳細な回答については、読み続けてください。
理解できませんが、なぜこのプログラムでは 431
ではなく 421
が出力されるのでしょうか?
以下に私の推測によるコメントを追加しました:
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()) }
defer
関数は 呼び出しませんが、recover() の呼び出しは、遅延関数から呼び出された場合にのみパニック状態を停止します (defer accept() はこの条件を満たしません)。 「deferrecover()」がパニックを捕捉しないのはなぜですか? を参照してください。
リーリー
上記のコードの実行プロセスは次のとおりです:
l2:o() の引数を評価し、
f() を呼び出します。
x は
1 にインクリメントされます (出力されます)後で) 。
o() はまだ呼び出されていません。
l7:
f() はまだ呼び出されていません。
x はまだ
1 です。
recover() が呼び出されませんでした。
f() を呼び出し、
x を
2 にインクリメントしてから戻り、
2 が
に渡されます。パニック()###。
パニック状態になっているので、遅延した関数を (lifo の順序で) 実行します。
l8:
recover() が呼び出されますが、パニック状態は停止しません。
l7:
が呼び出され、x
が 3
に増加します。
l3: この匿名関数が実行されます。
recover()
は2
(panic()
に渡される値) を返します。これは後で出力されますが、次の理由によりまだ出力されていません。 o()
の呼び出しは延期されます。パニック状態はここで終わります。
l5: f() を呼び出し、x
を 4
にインクリメントし、すぐに出力します。
l4: 遅延関数
が実行され、上記の値 2
が出力されます。
l2: 遅延関数
が実行され、以前に計算された値 1
が出力されます。
プログラムは終了します。
以上がこのプログラムはなぜ結果に 421 を出力するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。