Go のパニック リカバリーでローカル変数はどのように動作しますか?

Mary-Kate Olsen
リリース: 2024-10-29 14:20:02
オリジナル
648 人が閲覧しました

How Do Local Variables Behave in Panic Recovery in Go?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!