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这样的语言相比)