Все вопросы

27 Свои типы

Что даёт встраивание структуры?

Поле без имени встраивает другой тип и поднимает его поля и методы наружу. Admin можно звать как a.Greet(), хотя метод объявлен на User. Это композиция: внешний тип не становится подтипом внутреннего, и метод User не вызывает «переопределённый» метод Admin.

Свой метод с тем же именем на внешней структуре затеняет поднятый. Внутренний по-прежнему доступен как a.User.Greet().

Встраивание интерфейса поднимает его методы и заставляет внешний тип их реализовать — так иногда собирают интерфейс из маленьких частей.

Пример

Go

Greet поднялся из User

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