指定された Go コード スニペットでは、sub( ) 関数。 sub() 内の遅延関数は、別の値で再びパニックになります。問題は、特にプログラムがすでにパニック状態にある場合に、遅延関数内でパニックを起こしてもよいかということです。
はい、遅延関数内でパニックを起こすことは許容されます。既存のパニック。遅延関数によるパニックは、固有または異常な状態を開始しません。これは単にパニック シーケンスを延長するだけです。
提供されたコード例は、遅延関数によるパニックが無害であることを示しており、より高いレベルでの reverse() を使用した回復も可能であることを示しています。
パニックの処理に関する Go 仕様によると:
「同じゴルーチン上の関数がパニックになった場合、遅延関数は、最も外側の遅延関数 (一番外側の遅延関数) を使用して、遅延されたのと同じ順序で実行されます。最後に呼び出された) 最初に実行されます。遅延関数呼び出しが Recovery でゴルーチン内のどこかでパニックが発生した場合、recover に渡される値は、panic への最初の呼び出しに渡される値になります。"
遅延関数内でパニックを起こすことは許容されますが、次のことに注意することが重要です。
次の例は、この動作を示しています。
<code class="go">func main() { defer func() { fmt.Println("Checkpoint 1"); panic(1) }() defer func() { fmt.Println("Checkpoint 2"); panic(2) }() panic(999) }</code>
出力:
Checkpoint 2 Checkpoint 1 panic: 999 panic: 2 panic: 1
すべての遅延関数が実行され、すべての Panic() 呼び出しに渡された値が最終的なパニック シーケンスに含まれます。
Go では、既存のパニック中でも、defer 関数内でのパニックが許容されます。ただし、遅延関数の実行の順序と結果を認識し、パニックを処理するためにrecover()を適切に使用することが重要です。
以上がGo で既存のパニックが発生しているときに、Defer 関数内でパニックを起こすことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。