ホームページ  >  記事  >  バックエンド開発  >  このプログラムはなぜ結果に 421 を出力するのでしょうか?

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

王林
王林転載
2024-02-10 19:48:07883ブラウズ

このプログラムはなぜ結果に 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 までご連絡ください。