Вложенные литералы инициализации структуры
Как это сделать:
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 (из родительской) структуры, когда я предоставляю такие значения элемента литерала, как это?
Ответы
Ответ 1
При инициализации анонимная структура известна только под ее именем типа (в вашем случае A
).
Члены и функции, связанные со структурой, экспортируются только снаружи после
экземпляр существует.
Вы должны указать действительный экземпляр A
для инициализации MemberA
:
b := B {
A: A{MemberA: "test1"},
MemberB: "test2",
}
Ошибка компилятора
неизвестное поле B 'MemberA' в структурном литерале
говорит точно, что: там нет MemberA
, поскольку он все еще находится в A
, а не в B
. По факту,
B
никогда не будет MemberA
, он всегда останется в A
. Доступ к MemberA
на экземпляре B
есть только синтаксический сахар.
Ответ 2
Проблема заключается в объявлении структуры A в B. Пожалуйста, укажите имя вместе с объявлением, затем оно работает.
package main
import "fmt"
type A struct {
MemberA string
}
type B struct {
MemA A
MemberB string
}
func main() {
b := B{MemA: A{MemberA: "test1"}, MemberB: "test2"}
fmt.Println(b.MemberB)
}