Встраивание не является наследованием. Когда вы встраиваете тип структуры в другой, вы, по сути, составляете новый тип, а не расширяете встроенный тип.
type Inner struct {
X int
}
type Outer struct {
Inner
}
Выше, Outer
- это структура, содержащая Inner
. Когда вы объявляете переменную типа Outer
, вы можете получить доступ к полям структуры Inner
с помощью:
x:=Outer{}
x.Inner.X=1
x.X=1
Так что на самом деле это не отличается от:
type Outer struct {
Inner Inner
}
с той разницей, что имя поля опущено. Таким образом, вы можете сократить имя поля при доступе к переменным.
Короче: метод внутренней структуры не может получить доступ к структуре внедрения. Если вам это нужно, имейте метод конструктора для внешней структуры, который устанавливает указатель во внутренней структуре. Также передайте указатель на возвращенную структуру. Если вы копируете структуру, указатель необходимо отрегулировать.
type Outer struct {
Inner
}
type Inner struct {
X int
o *Outer
}
func NewOuter() *Outer {
ret:=&Outer{}
ret.outer=ret
return ret
}