Aym*_*man 20 struct embedding go composite-literals
我有这些类型:
type Value interface{}
type NamedValue struct {
Name string
Value Value
}
type ErrorValue struct {
NamedValue
Error error
}
Run Code Online (Sandbox Code Playgroud)
我可以使用v := NamedValue{Name: "fine", Value: 33}
,但我无法使用e := ErrorValue{Name: "alpha", Value: 123, Error: err}
似乎嵌入语法没问题,但使用它不起作用?
icz*_*cza 28
嵌入类型是(未命名)字段,由非限定类型名称引用.
使用类型但没有显式字段名称声明的字段是匿名字段,也称为嵌入字段或在结构中嵌入类型.必须将嵌入类型指定为类型名称
T
或指向非接口类型名称的指针*T
,并且T
它本身可能不是指针类型.非限定类型名称充当字段名称.
所以尝试:
e := ErrorValue{NamedValue: NamedValue{Name: "fine", Value: 33}, Error: err}
Run Code Online (Sandbox Code Playgroud)
如果省略复合文字中的字段名称,也可以使用:
e := ErrorValue{NamedValue{"fine", 33}, err}
Run Code Online (Sandbox Code Playgroud)
试试Go Playground上的例子.
对于深度嵌套的结构,接受的答案的语法有点冗长。例如,这个:
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)
}
Run Code Online (Sandbox Code Playgroud)
(去游乐场)
可以这样重写:
a := Alternative{}
a.QuestionnaireName = "q"
Run Code Online (Sandbox Code Playgroud)