Встроенный тип структуры Golang

У меня есть следующие типы:

type Value interface{}

type NamedValue struct {
    Name  string
    Value Value
}

type ErrorValue struct {
    NamedValue
    Error error
}

Я могу использовать use v := NamedValue{Name: "fine", Value: 33}, но я не могу использовать e := ErrorValue{Name: "alpha", Value: 123, Error: err}

Кажется, что синтаксис внедрения хорошо, но использование его не работает?

Ответ 1

Встраиваемые типы представляют собой (неназванные) поля, на которые ссылается неквалифицированное имя типа.

Spec: Типы структуры:

Поле, объявленное с типом, но не явным именем поля, является анонимным полем, также называемым встроенным полем или вложением типа в структуре. Вложенный тип должен быть указан как имя типа T или как указатель на имя типа без интерфейса *T, а сам T может не быть типом указателя. Неквалифицированное имя типа действует как имя поля.

Итак, попробуйте:

e := ErrorValue{NamedValue: NamedValue{Name: "fine", Value: 33}, Error: err}

Также работает, если вы опускаете имена полей в составном литерале:

e := ErrorValue{NamedValue{"fine", 33}, err}

Попробуйте примеры на Go Playground.

Ответ 2

В дополнение к прекрасному ответу от icza.

Вы можете просто сделать это:

v := NamedValue{Name: "fine", Value: 33}
e := ErrorValue{NamedValue:v, Error: err}

и все работает отлично. проверить пример здесь