duangua5742 2019-05-21 08:25
浏览 27
已采纳

Golang嵌入式结构

I am a little confused with a behavior of Go regarding variable 'overriding' in embedded structure.

First situation If a child structure embeds a parent structure containing a field Attr, I can access the value of Attr indifferently with child.Attr or child.parent.Attr. Here is an example :

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)
}

Second situation However, if the child structure contains itself a field named Attr, those two fields are different and can be accessed separately, as shows the following example :

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)
}

I am very surprised that this implicit behavior is allowed in golang. I would have expected the language to be stricter as it is on so many points. Besides, I wasn't able to find a clear specification about this. Is it just a side-effect or can I use that feature?

  • 写回答

1条回答 默认 最新

  • douzuo0002 2019-05-21 09:10
    关注

    Golang specification actually states how embedded fields are resolved

    A selector f may denote a field or method f of a type T, or it may refer to a field or method f of a nested embedded field of T. The number of embedded fields traversed to reach f is called its depth in T. The depth of a field or method f declared in T is zero. The depth of a field or method f declared in an embedded field A in T is the depth of f in A plus one.

    Then...

    For a value x of type T or *T where T is not a pointer or interface type, x.f denotes the field or method at the shallowest depth in T where there is such an f. If there is not exactly one f with shallowest depth, the selector expression is illegal.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 STM32F103上电短路问题
  • ¥15 关于#单片机#的问题:以ATMEGA128或相近型号单片机为控制器设计直流电机调速的闭环控制系统(相关搜索:设计报告|软件设计|流程图)
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
  • ¥20 学生成绩管理系统设计
  • ¥15 来一个cc穿盾脚本开发者
  • ¥15 CST2023安装报错
  • ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办