Golang 嵌入式结构

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

第一种情况 如果一个child结构嵌入了一个parent包含字段的结构,我可以用orAttr无差别地访问 Attr 的值。这是一个例子:child.Attrchild.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)

}

第二种情况 但是,如果子结构本身包含一个名为 的字段Attr,则这两个字段是不同的,可以单独访问,如以下示例所示:

package main


import (

    "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 中允许这种隐式行为。我原以为语言会更严格,因为它在很多方面都如此。此外,我找不到关于此的明确规范。这只是副作用还是我可以使用该功能?


月关宝盒
浏览 114回答 1
1回答

HUH函数

Golang 规范实际上说明了嵌入式字段是如何解析的一个选择器f可能表示一个类型T的字段或方法f,也可能指代T的嵌套嵌入字段的字段或方法f。遍历到达f的嵌入字段的个数称为它在T中的深度。 T 中声明的字段或方法 f 的深度为零。在 T 中的嵌入字段 A 中声明的字段或方法 f 的深度是 f 在 A 中的深度加一。然后...对于类型为 T 或 *T 的值 x,其中 T 不是指针或接口类型,xf 表示 T 中存在此类 f 的最浅深度处的字段或方法。如果不存在深度最浅的 f,则选择器表达式是非法的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go