子ゴルーチンのパニックからの呼び出し元関数の回復
一般に信じられていることに反して、ゴルーチンのパニックは必ずしもプログラム全体を終了させるわけではありません。この誤解は、呼び出し元の遅延回復機能がパニックに対処するという想定から生じています。ただし、ゴルーチンでパニックが発生する前に呼び出し元が終了した場合はこの限りではありません。
次の例を考えてみましょう。
<code class="go">func fun1() { fmt.Println("fun1 started") defer func() { if err := recover(); err != nil { fmt.Println("recover in func1") } }() go fun2() time.Sleep(10 * time.Second) // wait for the boom! fmt.Println("fun1 ended") } func fun2() { fmt.Println("fun2 started") time.Sleep(5 * time.Second) panic("fun2 booom!") fmt.Println("fun2 ended") }</code>
呼び出し元関数 (fun1) の実行が終了しているにもかかわらず、 fun2 がパニックを起こしてもプログラムは終了します。これが発生するのは、Go の仕様で、ゴルーチンでパニックが発生すると次のように定義されているためです。
この場合、fun2 はゴルーチンの最上位関数であり、パニックから回復しません。したがって、プログラムは終了します。
重要な点は、
ゴルーチンは、別のゴルーチンで発生したパニックから回復できないということです。
以上が呼び出し元関数は子ゴルーチンのパニックから回復できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。