为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 嵌入式结构

Golang 嵌入式结构

Go
月关宝盒 2023-06-19 15:42:28
我对 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,则选择器表达式是非法的。


查看完整回答
反对 回复 2023-06-19
  • 1 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信