Go の名前付きリターンと通常のリターンはパニックの処理においてどのように異なりますか?

Linda Hamilton
リリース: 2024-11-20 11:50:10
オリジナル
264 人が閲覧しました

How Do Named and Normal Returns in Go Differ in Handling Panics?

名前付き戻り値 通常の戻り値に隠されたパニックのマスクを解除する

Go では、通常の戻り値と名前付き戻り値の違いは、可読性を超えています。名前付き戻り値を使用すると、戻り値を変更でき、パニック発生時の結果に影響します。

問題

次のコードを考えてみましょう:

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)
}
ログイン後にコピー

予期せず、NormalReturns は nil を返します。一方、NamedReturns はエラーを返します。この動作はどのように説明できますか?

説明

NormalReturns では、戻り値は nil (エラーのゼロ値) に初期化されます。 PanicIf42() のパニックにより return ステートメントに到達できないため、結果変数は nil に設定されたままになります。

対照的に、NamedReturns は名前付き戻り変数 err を宣言します。パニックが発生すると、遅延 catch() 関数がこの変数を変更します。 return ステートメントが実行されない場合でも、名前付きの結果値は保存されて返されます。

名前付きリターン機能

  • 名前付きリターンでは、遅延関数内の結果値へのアクセスと変更が可能です。
  • パニックにより return ステートメントに到達しない場合でも、名前付き戻り値を更新して返すことができます。
  • この動作により、パニックが発生している場合でも、ゼロ以外の値を返すことができます。 .

結論

名前付き戻り値を使用すると、戻り値の柔軟性と制御が向上します。これらにより、遅延関数による戻り値の変更が可能になり、パニックが発生した場合でも指定された値が返されることが保証されます。これらのニュアンスを理解することで、開発者は名前付きリターンを効果的に使用して例外的なケースを処理し、エラー状態を正確に伝えることができます。

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

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