繁体   English   中英

Golang 嵌入式结构体类型

[英]Golang embedded struct type

我有这些类型:

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}

试试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)
}

去游乐场

可以这样改写:

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

除了icza的精彩回答。

你可以简单地这样做:

v := NamedValue{Name: "fine", Value: 33}
e := ErrorValue{NamedValue:v, Error: err}

它工作得很好。 这里查看示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM