Подтвердить что ты не робот

Вложенные литералы инициализации структуры

Как это сделать:

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 (из родительской) структуры, когда я предоставляю такие значения элемента литерала, как это?

4b9b3361

Ответ 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)
}