嵌套的struct初始化文字

时间:2013-10-11 19:09:32

标签: struct go nested literals

我该怎么做:

type A struct {
    MemberA string
}

type B struct {
    A
    MemberB string
}

...

b := B {
    MemberA: "test1",
    MemberB: "test2",
}
fmt.Printf("%+v\n", b)

编译给我:“结构文字中的未知B字段'MemberA'”

当我提供像这样的文字结构成员值时,如何初始化MemberA(来自“父”结构)?

2 个答案:

答案 0 :(得分:38)

初始化时,匿名结构仅在其类型名称下已知(在您的情况下为A)。 与结构相关联的成员和函数仅在之后导出到外部 实例存在。

您必须提供A的有效实例才能初始化MemberA

b := B {
    A: A{MemberA: "test1"},
    MemberB: "test2",
}

编译器错误

  

未知的B领域'会员A'在struct literal中

确切地说:没有MemberA,因为它仍在A而不在B。事实上, B将永远不会MemberA,它将始终保留在A中。能够访问MemberAB的实例上只是语法糖。

答案 1 :(得分:-1)

问题在于在B中声明结构A.请指定名称和声明,然后它可以工作。

package main

import "fmt"

type A struct {
    MemberA string
}

type B struct {
    MemA    A
    MemberB string
}

func main() {
    b := B{MemA: A{MemberA: "test1"}, MemberB: "test2"}
    fmt.Println(b.MemberB)
}