Go を使用したパニック リカバリーでのローカル変数の割り当てを理解する
Go のパニック リカバリーを使用すると、ランタイム エラーを適切に処理できますが、よくある誤解が生じます。リカバリ関数内でローカル変数を使用する場合。
名前付き戻り値パニック回復
名前付き戻り値を処理する場合、リカバリ関数は、名前付き戻り値が返される前にこれらの変数にアクセスできます。戻ってきました。これにより、defer 関数内で値を割り当てることができます。
<code class="go">func foo() (result int, err error) { defer func() { if e := recover(); e != nil { result = -1 err = errors.New(e.(string)) } }() bar() result = 100 err = nil return }</code>
Panic Recovery でのローカル変数の割り当て
ただし、名前のない戻り値を持つローカル変数を使用する場合は、 、この動作は異なります。ローカル変数はスタック上に作成され、関数の入力時にゼロ値で初期化されます。割り当て前にパニックが発生した場合は、ゼロ値が保持されます。
<code class="go">func foo() (int, error) { var result int var err error defer func() { if e := recover(); e != nil { result = -1 err = errors.New(e.(string)) } }() bar() result = 100 err = nil return result, err }</code>
この例では、result と err はそれぞれ 0 と nil に初期化されます。割り当てが行われる前にパニックが発生すると、これらのゼロ値が返されます。その結果、出力は次のようになります。
result: 0
主な違い
名前付き戻り値は名前付き変数として扱われるため、defer 関数でそれらを直接変更できます。一方、ローカル変数はスタックに格納され、割り当てられるまで defer 関数にアクセスできません。
結論
パニックから回復する場合ローカル変数の場合、ローカル変数は割り当てられるまで初期化されないことを理解することが重要です。したがって、代入の前にパニックが発生すると、代入のゼロ値が保持され、戻り値に影響を与えます。
以上がGo のパニック リカバリーでローカル変数はどのように動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。