Golang встроенный тип структуры
У меня есть эти типы:
type Value interface{}
type NamedValue struct {
Name string
Value Value
}
type ErrorValue struct {
NamedValue
Error error
}
Я могу использовать использование v := NamedValue{Name: "fine", Value: 33}
, но я не умею пользоваться e := ErrorValue{Name: "alpha", Value: 123, Error: err}
Кажется, что встраивание синтаксиса было в порядке, но его использование не работает?
2 ответа
Встроенные типы - это (неназванные) поля, на которые ссылается неквалифицированное имя типа.
Поле, объявленное с типом, но без явного имени поля, является анонимным полем, также называемым встроенным полем или встраиванием типа в структуру. В качестве имени типа должен быть указан внедренный тип.
T
или как указатель на имя неинтерфейсного типа*T
, а такжеT
Сам по себе не может быть указателем типа. Неквалифицированное имя типа действует как имя поля.
Так что постарайтесь:
e := ErrorValue{NamedValue: NamedValue{Name: "fine", Value: 33}, Error: err}
Также работает, если вы опустите имена полей в составном литерале:
e := ErrorValue{NamedValue{"fine", 33}, err}
Попробуйте примеры на игровой площадке Go.
Для глубоко вложенных структур синтаксис принятого ответа немного подробен. Например, это:
package main
import (
"fmt"
)
type Alternative struct {
Question
AlternativeName string
}
type Question struct {
Questionnaire
QuestionName string
}
type Questionnaire struct {
QuestionnaireName string
}
func main() {
a := Alternative{
Question: Question{
Questionnaire: Questionnaire{
QuestionnaireName: "q",
},
},
}
fmt.Printf("%v", a)
}
Можно было бы переписать так:
a := Alternative{}
a.QuestionnaireName = "q"
Помимо чудесного ответа от icza.
Вы можете просто сделать это:
v := NamedValue{Name: "fine", Value: 33}
e := ErrorValue{NamedValue:v, Error: err}
и это работает просто отлично. Оформить пример здесь