このプログラムはなぜ結果に 421 を出力するのでしょうか?

王林
リリース: 2024-02-10 19:48:07
転載
863 人が閲覧しました

このプログラムはなぜ結果に 421 を出力するのでしょうか?

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()を呼び出します。x1にインクリメントされます (出力されます)後で) 。o()はまだ呼び出されていません。

l3: 遅延関数はまだ呼び出されておらず、本体全体が一時的にスキップされます。

l7:

f()はまだ呼び出されていません。xはまだ1です。

l8:

recover()が呼び出されませんでした。

l9:

f()を呼び出し、x2にインクリメントしてから戻り、2に渡されます。パニック()###。パニック状態になっているので、遅延した関数を (lifo の順序で) 実行します。

l8:

recover()

が呼び出されますが、パニック状態は停止しません。l7:

f()

が呼び出され、x3に増加します。l3: この匿名関数が実行されます。

l4:

recover()

2( panic()に渡される値) を返します。これは後で出力されますが、次の理由によりまだ出力されていません。 o()の呼び出しは延期されます。パニック状態はここで終わります。 l5: f()

を呼び出し、x4にインクリメントし、すぐに出力します。l4: 遅延関数

o()

が実行され、上記の値2が出力されます。l2: 遅延関数

o()

が実行され、以前に計算された値1が出力されます。プログラムは終了します。

以上がこのプログラムはなぜ結果に 421 を出力するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!