41

我怎样才能做到这一点:

type A struct {
    MemberA string
}

type B struct {
    A A
    MemberB string
}

...

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

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

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

4

2 回答 2

44

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

您必须提供一个有效的A初始化实例MemberA

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

编译器错误

结构文字中的未知 B 字段“MemberA”

确切地说:没有MemberA,因为它仍然在A而不是在B. 其实, B永远不会有MemberA,它会永远留在A。能够访问MemberA 的实例B只是语法糖。

于 2013-10-11T19:26:19.323 回答
-4

问题在于在 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)
}
于 2014-08-12T06:07:41.813 回答