我有以下类型:
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}
似乎嵌入语法没问题,但使用它不起作用?
答案 0 :(得分:26)
嵌入式类型是(未命名的)字段,由非限定类型名称引用。
使用类型但没有显式字段名称声明的字段是匿名字段,也称为嵌入式字段或在结构中嵌入类型。必须将嵌入类型指定为类型名称
T
或指向非接口类型名称*T
的指针,并且T
本身可能不是指针类型。 非限定类型名称用作字段名称。
所以试试:
e := ErrorValue{NamedValue: NamedValue{Name: "fine", Value: 33}, Error: err}
如果省略复合文字中的字段名称,也可以使用
e := ErrorValue{NamedValue{"fine", 33}, err}
尝试Go Playground上的示例。
答案 1 :(得分:0)
除了icza的精彩回答。
您可以简单地执行以下操作:
v := NamedValue{Name: "fine", Value: 33}
e := ErrorValue{NamedValue:v, Error: err}
,效果很好。检出示例Here
答案 2 :(得分:0)
对于深度嵌套的结构,可接受的答案的语法有些冗长。例如,这:
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"