web-dev-qa-db-fra.com

littéraux d'initialisation de structure imbriqués

Comment puis-je faire ceci:

type A struct {
    MemberA string
}

type B struct {
    A
    MemberB string
}

...

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

Compilation qui me donne: "champ B inconnu 'MemberA' dans la structure littérale"

Comment puis-je initialiser MemberA (à partir de la structure "parent") lorsque je fournis des valeurs littérales de membre struct comme celle-ci?

37
Brad Peabody

Pendant l'initialisation, la structure anonyme n'est connue que sous son nom de type (dans votre cas A). Les membres et les fonctions associés à la structure ne sont exportés vers l'extérieur qu'après que l'instance existe.

Vous devez fournir une instance valide de A pour initialiser MemberA:

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

L'erreur du compilateur

champ B inconnu "MemberA" dans le littéral struct

dit exactement cela: il n'y a pas de MemberA car il est toujours dans A et pas dans B. En fait, B n'aura jamais MemberA, il restera toujours dans A. Pouvoir accéder à MemberA sur une instance de B n'est que du sucre syntaxique.

40
nemo