Golang嵌入式结构类型

时间:2017-07-19 11:46:27

标签: 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}

似乎嵌入语法没问题,但使用它不起作用?

3 个答案:

答案 0 :(得分:26)

嵌入式类型是(未命名的)字段,由非限定类型名称引用。

Spec: Struct types:

  

使用类型但没有显式字段名称声明的字段是匿名字段,也称为嵌入式字段或在结构中嵌入类型。必须将嵌入类型指定为类型名称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)
}

Go playground

可以这样重写:

a := Alternative{}
a.QuestionnaireName = "q"