ホームページ > バックエンド開発 > Golang > 入れ子になった Go 構造で Nil 値を効果的に処理するにはどうすればよいですか?

入れ子になった Go 構造で Nil 値を効果的に処理するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-31 11:11:09
オリジナル
532 人が閲覧しました

How to Effectively Handle Nil Values in Nested Go Structures?

入れ子構造の Nil 値のテスト

Go の入れ子構造は、特に JSON からアンマーシャリングされたデータを扱う場合によく発生します。ただし、これらの構造体には「omimitempty」フィールドが含まれることが多く、その結果、さまざまなレベルで非 nil 値と nil 値が混在することになります。

この問題に対処するには、2 つの一般的なアプローチがあります。

1.手動の Nil チェック:

これには、次のような if ステートメントを使用して、各レベルで nil 値を明示的にチェックすることが含まれます。

if f2.Bar != nil && f2.Bar.Baz != nil {
    fmt.Println(f2.Bar.Baz.Baz)
}
ログイン後にコピー

この方法は簡単ですが、深く理解するには反復的で退屈になる可能性があります。入れ子構造。

2.ポインター レシーバーのゲッター:

よりエレガントで効率的なアプローチは、構造体内でポインターとして使用されるフィールドのゲッター メソッドを定義することです。これらのゲッターは、受信側が nil かどうかをチェックし、nil である場合はゼロ値を返します。それ以外の場合は、フィールド値を返します。

たとえば、Bar および Baz 構造体にゲッターを使用する場合:

func (b *Bar) GetBaz() *Baz {
    if b == nil {
        return nil
    }
    return b.Baz
}

func (b *Baz) GetBaz() string {
    if b == nil {
        return ""
    }
    return b.Baz
}
ログイン後にコピー

With getters in nil 値のチェックが簡素化されます:

fmt.Println(f3.Bar.GetBaz().GetBaz()) // No panic

if baz := f2.Bar.GetBaz(); baz != nil {
    fmt.Println(baz.GetBaz())
}
ログイン後にコピー

このメソッドでは、 if ステートメントを繰り返す必要がなく、nil ポインターの逆参照によって実行時パニックが発生することがなくなります。また、protobuf メッセージ用に生成された Go コードで使用されるアプローチとも一致しており、複雑な構造内の nil 値を処理するための自然で一貫した方法を提供します。

以上が入れ子になった Go 構造で Nil 値を効果的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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