関数がパニックになった場合、Go の名前付き戻り値と通常の戻り値はどのように異なりますか?

Linda Hamilton
リリース: 2024-11-24 08:18:09
オリジナル
304 人が閲覧しました

How Do Named and Normal Returns in Go Differ When a Function Panics?

名前付きリターンが呼び出し元に与えるパニックを通常のリターンが隠す理由

Go では、通常のリターン ステートメントと名前付きリターン ステートメントの両方が使用されます関数から値を返すため。ただし、関数がパニックしたときの動作には微妙な違いがあります。

通常の戻りでは、関数が呼び出されたときに戻り値はゼロ値に初期化されます。 return ステートメントに到達する前に関数がパニックになった場合、戻り値はゼロ値のままになります。たとえば、関数がエラー値を返した場合、関数がパニックになった場合、通常の戻り値は常に nil を返します。

対照的に、名前付き戻り値では、遅延関数または関数自体によって戻り値を変更することができます。関数は呼び出し元に戻ります。名前付き戻り値を持つ関数がパニックになった場合、遅延関数は、関数が呼び出し元に戻る前に戻り値を変更できます。

この違いは、次の例で説明できます。

package main

import (
    "fmt"
    "log"
)

func catch(err *error) {
    if r := recover(); r != nil {
        *err = fmt.Errorf("recovered panic: %v", r)
    }
}

func panicIf42(n int) {
    if n == 42 {
        panic("42!")
    }
}

func NormalReturns(n int) error {
    var err error
    defer catch(&err)
    panicIf42(n)
    return err
}

func NamedReturns(n int) (err error) {
    defer catch(&err)
    panicIf42(n)
    return
}

func main() {
    err := NamedReturns(42)
    log.Printf("NamedReturns error: %v", err)
    err = NormalReturns(42)
    log.Printf("NormalReturns error: %v", err)
}
ログイン後にコピー

出力このプログラムの内容は次のとおりです。

2009/11/10 23:00:00 NamedReturns error: recovered panic: 42!
2009/11/10 23:00:00 NormalReturns error: <nil>
ログイン後にコピー

ご覧のとおり、名前付き戻り値は非 nil エラーを返しますが、通常の戻り値は nil を返します。これは、NamedReturns 関数の遅延 catch 関数が、関数が呼び出し元に戻る前に err 戻り値を変更するためです。

この動作は、プログラム全体で一貫した方法でエラーを処理するのに役立ちます。名前付き return を使用すると、関数が return ステートメントに到達する前にパニックが発生した場合でも、パニックが発生した場合にすべての関数が nil 以外のエラーを返すようにすることができます。

以上が関数がパニックになった場合、Go の名前付き戻り値と通常の戻り値はどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート