遅延 Recovery() と Defer Recovery() の比較
Go では、recover() 関数を使用してパニックを捕捉し、処理できます。 。ただし、recover() 呼び出しに対する defer の配置には重大な影響があることに注意することが重要です。
シナリオ A: defer func() { reverse() }()
このシナリオでは、defer ステートメントは、現在の関数の最後に実行される匿名関数をスケジュールします。この関数が実行されると、recover() 関数が呼び出されます。これは、周囲の関数が実行を再開する前にパニックが発生した場合でも、recover() 関数が実行されるため、パニックをキャッチして処理する効果的な方法です。
シナリオ B: defer reverse()
このシナリオでは、recover() 関数自体が遅延関数としてスケジュールされています。ただし、recover() はそれ自体を呼び出さないため、これは意図したとおりに機能しません。したがって、囲んでいる関数が実行を再開する前に発生するパニックは、この遅延呼び出しによって捕捉されません。
この動作は Go ドキュメントに文書化されています。パニック シーケンス。"
興味深い例: defer (func() { reverse() })()
これをさらに詳しく説明するために、次のコードを考えてみましょう。
var recover = func() { recover() } defer recover() panic("panic")
驚くべきことに、このコードもパニックを起こしません。この場合、関数タイプのリカバリ変数を作成し、それを組み込みのrecover()を呼び出す匿名関数に初期化します。次に、recover 変数の値を遅延関数として指定します。これにより、遅延関数が事実上、recover() を呼び出し、パニック シーケンスを停止するため、パニックをキャッチして処理することができます。
以上がGo Panic Recovery: `recover()` の延期 – 違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。