Golang嵌入式结构类型

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上的例子.


Fed*_*ico 7

对于深度嵌套的结构,接受的答案的语法有点冗长。例如,这个:

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)