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