Голанг встраиваемых конструкций - PullRequest
0 голосов
/ 21 мая 2019

Я немного запутался с поведением Go относительно переменной 'overriding' во встроенной структуре.

Первая ситуация Если в структуру child встраивается структура parent, содержащая поле Attr, я могу получить равный доступ к значению Attr с помощью child.Attr или 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)
}

Вторая ситуация Однако, если дочерняя структура содержит само поле с именем 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)
}

Я очень удивлен, что это неявное поведение разрешено в Голанге. Я ожидал бы, что язык будет более строгим, так как он во многих отношениях. Кроме того, я не смог найти четкую спецификацию по этому поводу. Это просто побочный эффект или я могу использовать эту функцию?

1 Ответ

4 голосов
/ 21 мая 2019

В спецификации Голанга фактически указывается, как разрешаются встроенные поля

Селектор f может обозначать поле или метод f типа T, или он может ссылаться на поле или метод f вложенного встроенногополе T. Число вложенных полей, пройденных для достижения f, называется его глубиной в T. Глубина поля или метода f, объявленного в T, равна нулю.Глубина поля или метода f, объявленных во встроенном поле A в T, равна глубине f в A плюс один.

Тогда ...

Длязначение x типа T или * T, где T не является указателем или типом интерфейса, xf обозначает поле или метод на самой малой глубине в T, где есть такое f.Если нет точно одного f с наименьшей глубиной, выражение селектора недопустимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...