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
}