我对Go关于嵌入式结构中变量“覆盖”的行为感到困惑。
第一种情况
如果child
结构嵌入包含字段parent
的{{1}}结构,则可以使用Attr
或child.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中允许这种隐式行为。我希望该语言在很多方面都更加严格。此外,我无法找到明确的规范。仅仅是副作用还是我可以使用该功能?
答案 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。如果不完全是一个 最浅的深度,选择器表达式是非法的。