Я немного запутался с поведением 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)
}
Я очень удивлен, что это неявное поведение разрешено в Голанге. Я ожидал бы, что язык будет более строгим, так как он во многих отношениях. Кроме того, я не смог найти четкую спецификацию по этому поводу. Это просто побочный эффект или я могу использовать эту функцию?