ホームページ >バックエンド開発 >Golang >Goでリテラルを使用して入れ子構造を正しく初期化する方法?

Goでリテラルを使用して入れ子構造を正しく初期化する方法?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-17 10:34:25390ブラウズ

How to Correctly Initialize Nested Structures in Go Using Literals?

入れ子構造とフィールド初期化リテラル

Go では、構造は入れ子構造として知られる他の構造を埋め込むことができます。ネストされた構造体をリテラルのメンバー値で初期化する場合、コンパイラが親構造体の不明なフィールドにフラグを立てるという問題がよく発生します。

たとえば、次のコードを考えてみましょう。

type A struct {
    MemberA string
}

type B struct {
    A
    MemberB string
}

b := B {
    MemberA: "test1",
    MemberB: "test2",
}

ここで、B 構造体は、A 型の匿名フィールドを含むように定義されています。ただし、ネストされた A 構造体の MemberA フィールドを直接初期化しようとすると、コンパイラはerror:

unknown B field 'MemberA' in struct literal

このエラーは、初期化中に匿名構造体がその型名によってのみ認識されるために発生します。匿名構造体に関連付けられたメンバーと関数は、インスタンスが作成されるまでエクスポートされません。

この問題を解決するには、初期化時に匿名構造体の有効なインスタンス (この場合は A) を指定する必要があります。ネストされたフィールド:

b := B {
    A: A{MemberA: "test1"},
    MemberB: "test2",
}

匿名構造体のインスタンスを明示的に提供することで、MemberA にアクセスするために必要な情報をコンパイラに提供します。

コンパイラ エラー メッセージ「unknown B field 'MemberA' in struct literal」は、MemberA フィールドが匿名 A 構造体に属しているため、B 構造体コンテキスト内で認識されないことを示します。

以上がGoでリテラルを使用して入れ子構造を正しく初期化する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。