Skip to content

Встраивание структур (Embedding)

Go не поддерживает наследование в классическом смысле; вместо этого поощряет композицию как способ расширения функциональности типов. Это понятие не свойственно Go. Композиция важнее наследования — это известный принцип ООП, описанный в самой первой главе книги «Шаблоны проектирования». Рекомендуем почитать эту книгу.

Встраивание — важная функция Go, делающая композицию более удобной и полезной. В то время как Go стремится быть простым, встраивание — это то место, где существенная сложность проблемы несколько просачивается. Далее мы рассмотрим различные виды встраивания и примеры из реального кода.

В Go есть три вида встраивания:

  • Структуры в структурах.

  • Интерфейсы в интерфейсах.

  • Интерфейсы в структурах.

Начнем с простого примера, демонстрирующего встраивание одной структуры в другую.

Самое время протестировать код!

Как видно из примера, переменная container с типом Container из-за встраивания структуры Base имеет доступ к полю b с типом int. На самом деле, поле не становится доступным по прямому обращению к полю, а такая запись является синтаксическим сахаром. В спецификации это называется продвигаемым полем. В структуре появляется поле Base с типом Base.

Самое время протестировать код!

Однако при использовании литерала структуры мы должны инициализировать встроенную структуру целиком, а не ее поля. Продвинутые поля нельзя использовать в качестве имен полей в составных литералах структуры.

Самое время протестировать код!

С полной версией статьи ты можешь ознакомиться по ссылке.