27 Свои типы
Что даёт встраивание структуры?
Ответ
Поле без имени встраивает другой тип и поднимает его поля и методы наружу. Admin можно звать как a.Greet(), хотя метод объявлен на User. Это композиция: внешний тип не становится подтипом внутреннего, и метод User не вызывает «переопределённый» метод Admin.
Подробнее
Свой метод с тем же именем на внешней структуре затеняет поднятый. Внутренний по-прежнему доступен как a.User.Greet().
Встраивание интерфейса поднимает его методы и заставляет внешний тип их реализовать — так иногда собирают интерфейс из маленьких частей.
package main
import "fmt"
type User struct {
Name string
}
func (u User) Greet() string {
return "привет, " + u.Name
}
type Admin struct {
User
Level int
}
func main() {
a := Admin{User: User{Name: "Аня"}, Level: 2}
fmt.Println(a.Greet(), a.Level)
}