Встраивание (embedding) в Go позволяет одной структуре использовать поля и методы другой структуры, как если бы они были её собственными.
Ключевые отличия от наследования:
- Композиция vs. Иерархия: Встраивание — это форма композиции ("has-a"), где одна структура имеет другую. Наследование (в классическом ООП) — это форма иерархии ("is-a"), где один класс является подклассом другого.
- Полиморфизм: Go не поддерживает полиморфизм подтипов в традиционном смысле наследования. Полиморфизм в Go реализуется через интерфейсы.
- Доступ: Встраивание делает поля и видимые методы встроенной структуры доступными напрямую через внешнюю структуру, но не создаёт при этом иерархии типов.
- Отсутствие overridden: Нет механизма прямого "переопределения" методов базового класса. Можно определить метод с тем же именем во внешней структуре, который "затенит" встроенный метод.
Пример встраивания:
go
В этом примере Car имеет Engine, но Car не является подтипом Engine. Мы просто получаем удобный доступ к полям и методам Engine через структуру Car.