Встраивание структур (Embedding)
Go не поддерживает наследование в классическом смысле; вместо этого поощряет композицию как способ расширения функциональности типов. Это понятие не свойственно Go. Композиция важнее наследования — это известный принцип ООП, описанный в самой первой главе книги «Шаблоны проектирования». Рекомендуем почитать эту книгу.
Встраивание — важная функция Go, делающая композицию более удобной и полезной. В то время как Go стремится быть простым, встраивание — это то место, где существенная сложность проблемы несколько просачивается. Далее мы рассмотрим различные виды встраивания и примеры из реального кода.
В Go есть три вида встраивания:
-
Структуры в структурах.
-
Интерфейсы в интерфейсах.
-
Интерфейсы в структурах.
Начнем с простого примера, демонстрирующего встраивание одной структуры в другую.
Самое время протестировать код!
Как видно из примера, переменная container с типом Container из-за встраивания структуры Base имеет доступ к полю b с типом int. На самом деле, поле не становится доступным по прямому обращению к полю, а такая запись является синтаксическим сахаром. В спецификации это называется продвигаемым полем. В структуре появляется поле Base с типом Base.
Самое время протестировать код!
Однако при использовании литерала структуры мы должны инициализировать встроенную структуру целиком, а не ее поля. Продвинутые поля нельзя использовать в качестве имен полей в составных литералах структуры.
Самое время протестировать код!
С полной версией статьи ты можешь ознакомиться по ссылке.