Golang嵌入式结构类型
我有以下几种:Golang嵌入式结构类型,go,struct,embedding,composite-literals,Go,Struct,Embedding,Composite Literals,我有以下几种: 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} 似乎嵌
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}
似乎嵌入语法还可以,但使用它不起作用?嵌入类型是(未命名)字段,由非限定类型名引用
用类型声明但没有显式字段名的字段是匿名字段,也称为嵌入字段或结构中类型的嵌入。嵌入类型必须指定为类型名T
或指向非接口类型名*T
的指针,并且T
本身不能是指针类型非限定类型名用作字段名。
因此,请尝试:
e := ErrorValue{NamedValue: NamedValue{Name: "fine", Value: 33}, Error: err}
如果在复合文字中省略字段名,也可以使用:
e := ErrorValue{NamedValue{"fine", 33}, err}
除了icza的精彩答案之外,还可以尝试。上的示例 您可以简单地执行以下操作:
v := NamedValue{Name: "fine", Value: 33}
e := ErrorValue{NamedValue:v, Error: err}
而且效果很好。检查示例对于深度嵌套的结构,接受的答案的语法有点冗长。例如,这:
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"
在使用嵌入类型命名结构中的字段时,有没有最佳做法?@SeanPianka你是什么意思?命名字段和嵌入是有争议的:嵌入的字段是匿名字段。省略字段名确实可以像前面提到的那样工作,但是如果您的结构有许多字段,那么不幸的是,您还需要传递它们。例如,对于一个具有四个属性的结构,如果您的嵌入式结构是第一个字段之一,那么您需要像
ErrorValue{nil,NamedValue{“fine”,33},nil,nil}
那样初始化它,这看起来不像在中传递嵌入式结构的非限定类型名称那样干净。前面提到的第一种方法有点好,但我忍不住觉得它有点不必要的复杂和笨拙(至少与Python这样的语言相比)