入れ子構造とフィールド初期化リテラル
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 サイトの他の関連記事を参照してください。