web-dev-qa-db-ja.com

ネストされた構造体初期化リテラル

これどうやってするの:

type A struct {
    MemberA string
}

type B struct {
    A
    MemberB string
}

...

b := B {
    MemberA: "test1",
    MemberB: "test2",
}
fmt.Printf("%+v\n", b)

それをコンパイルすると、「構造体リテラルの不明なBフィールド 'MemberA'」が表示されます。

このようなリテラル構造体メンバー値を提供するときに、(「親」構造体から)MemberAを初期化するにはどうすればよいですか?

37
Brad Peabody

初期化中、匿名構造体はその型名(あなたの場合はA)でしか知られていません。構造体に関連付けられたメンバーと関数は、インスタンスが存在した後でのみ外部にエクスポートされます。

Aを初期化するには、MemberAの有効なインスタンスを指定する必要があります:

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

コンパイラエラー

構造体リテラルの不明なBフィールド 'MemberA'

それは正確に言っています:MemberAAではなくBにまだあるのでありません。実際、BMemberAが含まれることはなく、常にAに残ります。 MemberAのインスタンスでBにアクセスできることは、単なる構文上の砂糖です。

40
nemo