Golang嵌入式结构

时间:2019-05-21 08:25:41

标签: go

我对Go关于嵌入式结构中变量“覆盖”的行为感到困惑。

第一种情况 如果child结构嵌入包含字段parent的{​​{1}}结构,则可以使用Attrchild.Attr来访问Attr的值。这是example

child.parent.Attr

第二种情况 但是,如果子结构本身包含一个名为package main import ( "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) } 的字段,则这两个字段是不同的,可以分别访问,如以下example所示:

Attr

我很惊讶golang中允许这种隐式行为。我希望该语言在很多方面都更加严格。此外,我无法找到明确的规范。仅仅是副作用还是我可以使用该功能?

1 个答案:

答案 0 :(得分:4)

Golang规范实际上说明了如何解析嵌入字段

  

选择器f可以表示类型T的字段或方法f,或者可以   引用T的嵌套嵌入字段的字段或方法f。   遍历到达f的嵌入场的数量称为其深度in   T。在T中声明的字段或方法f的深度为零。深度   在T中的嵌入字段A中声明的字段或方法f的值是   f在A中加1的深度。

然后...

  

对于类型T或* T的值x,其中T不是指针或接口   类型,x.f表示T中最浅深度的字段或方法   哪里有这样的f。如果不完全是一个   最浅的深度,选择器表达式是非法的。