Go 嵌入式结构反对这种情况

Go 嵌入式结构反对这种情况,go,Go,我们有三种类型: type A struct { B C } type B struct { x int y string } type C struct { z string } 由于匿名字段的字段和方法是如何的,我们可以访问匿名字段B的字段,就像 很明显,类型B&C嵌入在A中,因此我们希望A等同于: type D struct { x int y string z string } 你期望看到什么? 我们希望可以像这样编写类

我们有三种类型:

type A struct {
    B
    C
}
type B struct {
    x int
    y string
}
type C struct {
    z string
}
由于匿名字段的字段和方法是如何的,我们可以访问匿名字段B的字段,就像

很明显,类型B&C嵌入在A中,因此我们希望A等同于:

type D struct {
    x int
    y string
    z string
}
你期望看到什么? 我们希望可以像这样编写类型A的复合文本:

a := A{x: 2}
你看到了什么? 此编译错误:

unknown field 'x' in struct literal of type A
我们的问题 为什么不能像对类型D那样为A编写复合文本


初始化A时需要显式使用B和C:


a=a{B{x:2},C{}

罗布·派克解释了这一点

他在那里写道:

也许有一天会这样,但按照目前的情况,我们需要提供更多 对于数据类型的更改,信息更可靠

如果我理解和解释正确,这基本上是一项安全措施。如果结构定义与复合文本不匹配,编译器会对您大喊大叫

在您的示例中,A的定义可能会发生变化——在以后的变化中,就像在以后的许多年中一样——为:

    type A struct {
        x int
        y string
        z string
    }
稍后,但是x、y和z可能表示与以前不同的内容,因此最好将所有文本都更改为 无法获取某种类型的静态损坏数据

这是一个深思熟虑的选择。语言规范中的措辞为:

提升字段的作用类似于结构的普通字段,只是它们不能用作结构的复合文本中的字段名

因此,您可以使用字段B的字段x,就好像它是除复合文字外的a的字段一样

类型呢

type A struct {
    B
    C
}


真的是两码事。前者包含两个字段B和C,后者包含三个字段x、y和z。前者只是有一些语法糖,可以用速记方式访问字段B的字段x。所以,如果a是前一种类型a的变量,a.x是a.B.x的语法糖。

可能重复的可能重复的可能重复的感谢回答。但我有疑问地解释了为什么我们可以使用a.x=0!!?如果是安全选择,为什么modela.x=0可以工作?我们必须在同一件事上有不同的想法!!我扩大了我的答案。
type A struct {
    B
    C
}
type A struct {
    x int
    y string
    z string
}