Sobes.tech
Назад к вопросам
Senior
4

В чём разница между встраиванием (embedding) и композицией в Go?

Компании, где спрашивали
техвил

Ответ от нейросети

sobes.tech AI

В Go встраивание (embedding) и композиция — это два способа повторного использования кода, но с разными семантиками и синтаксисом.

Встраивание (embedding):

  • Позволяет включить один тип (структуру или интерфейс) внутрь другого без явного поля.
  • Встраиваемые методы и поля становятся доступными напрямую через внешний тип.
  • Это похоже на наследование, но без явного наследования.

Пример:

type Logger struct {
    Prefix string
}

func (l Logger) Log(msg string) {
    fmt.Println(l.Prefix, msg)
}

// Встраивание Logger в App
type App struct {
    Logger
    Name string
}

app := App{Logger: Logger{Prefix: "[App]"}, Name: "MyApp"}
app.Log("started") // можно вызвать напрямую

Композиция:

  • Означает, что структура содержит другое поле с типом, но доступ к методам/полям происходит через это поле.
  • Нет автоматического продвижения методов во внешний тип.
  • Более явный и контролируемый способ объединения функционала.

Пример:

type Engine struct {
    Power int
}

func (e Engine) Start() {
    fmt.Println("Engine started with power", e.Power)
}

// Композиция Engine в Car
type Car struct {
    engine Engine
    Model  string
}

car := Car{engine: Engine{Power: 100}, Model: "Sedan"}
car.engine.Start() // нужно явно обращаться к полю

Ключевые отличия:

  • Встраивание упрощает доступ к методам и полям встраиваемого типа, делая их частью внешнего типа.
  • Композиция требует явного обращения к вложенному полю.
  • Встраивание часто используется для реализации интерфейсов и расширения функционала.

Таким образом, embedding — это синтаксический сахар для композиции с автоматическим продвижением методов и полей.