【问题标题】:nested struct initialization literals嵌套结构初始化文字
【发布时间】:2013-10-11 19:09:31
【问题描述】:

我该怎么做:

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(来自“父”结构)?

【问题讨论】:

    标签: struct go nested literals


    【解决方案1】:

    在初始化时,匿名结构仅以其类型名称为人所知(在您的情况下为 A)。 与结构关联的成员和函数仅在 实例存在。

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

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

    编译错误

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

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

    【讨论】:

    • 完美——是的,我试过B { A{MemberA: "test1"}, MemberB: "test2" },但这也不起作用——看起来你必须像上面那样对待嵌套结构。谢谢!
    【解决方案2】:

    问题在于在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)
    }
    

    【讨论】:

    • 声明一个字段和嵌入一个类型是两个不同的东西。如果你指定一个名字,那就是声明。当您省略名称时,即为嵌入。你不是在回答这个问题,你的回答是另一种建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多