我对 Go 关于嵌入式结构中变量“覆盖”的行为有点困惑。第一种情况 如果一个child结构嵌入了一个parent包含字段的结构,我可以用orAttr无差别地访问 Attr 的值。这是一个例子:child.Attrchild.parent.Attrpackage mainimport ( "fmt" "encoding/json")type parent struct { Attr int `json:"attr"`}type child struct { parent}func main() { var c child json.Unmarshal([]byte(`{"i": 1}`), &c) fmt.Println(c.Attr) fmt.Println(c.parent.Attr)}第二种情况 但是,如果子结构本身包含一个名为 的字段Attr,则这两个字段是不同的,可以单独访问,如以下示例所示:package mainimport ( "fmt" "encoding/json")type parent struct { Attr int `json:"attr"`}type child struct { parent Attr int}func main() { var c child json.Unmarshal([]byte(`{"attr": 1}`), &c) fmt.Println(c.Attr) fmt.Println(c.parent.Attr)}我很惊讶 golang 中允许这种隐式行为。我原以为语言会更严格,因为它在很多方面都如此。此外,我找不到关于此的明确规范。这只是副作用还是我可以使用该功能?
1 回答
HUH函数
TA贡献1836条经验 获得超4个赞
Golang 规范实际上说明了嵌入式字段是如何解析的
一个选择器f可能表示一个类型T的字段或方法f,也可能指代T的嵌套嵌入字段的字段或方法f。遍历到达f的嵌入字段的个数称为它在T中的深度。 T 中声明的字段或方法 f 的深度为零。在 T 中的嵌入字段 A 中声明的字段或方法 f 的深度是 f 在 A 中的深度加一。
然后...
对于类型为 T 或 *T 的值 x,其中 T 不是指针或接口类型,xf 表示 T 中存在此类 f 的最浅深度处的字段或方法。如果不存在深度最浅的 f,则选择器表达式是非法的。
- 1 回答
- 0 关注
- 113 浏览
添加回答
举报
0/150
提交
取消