Получить доступ

Как в Go обходятся без наследования — что такое встраивание (embedding)?

JuniorМетоды и интерфейсы
Ещё спрашивают так:
  • Есть ли в Go наследование?
  • Композиция вместо наследования в Go
Коротко

Наследования нет. Встраивание — поле без имени: методы и поля встроенного типа продвигаются во внешний и вызываются напрямую. Это композиция, а не наследование: нет переопределения с полиморфизмом — встроенный тип не знает о внешнем.

  • Внешний тип может объявить метод с тем же именем — он перекроет продвинутый
  • Встроенный тип вызывает свои методы, а не «переопределённые» внешним
  • Полиморфизм в Go — через интерфейсы

А ещё Встраивание интерфейса в структуру — частичная реализация, остальные методы паникуют на nil

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Продвижение. Поля и методы встроенного типа доступны как свои: s.Log(), s.prefix. Методы встроенного типа входят в набор методов внешнего, поэтому Service удовлетворяет интерфейсам, которым удовлетворяет Logger.

Почему это не наследование. Если Logger.Log вызывает l.format(), а Service объявил свой format, вызовется Logger.format — никакой виртуальной диспетчеризации. Нет и преобразования Service к Logger: это разные типы.

Встраивание интерфейсов в интерфейсы — сборка контрактов: type ReadWriter interface { Reader; Writer }.

Когда осторожно: встраивание расширяет публичный API внешнего типа всеми методами встроенного; встроенный sync.Mutex делает Lock доступным снаружи — обычно лучше именованное поле mu sync.Mutex.

Пример

type Logger struct{ prefix string }
func (l Logger) Log(msg string) { fmt.Println(l.prefix, msg) }

type Service struct {
    Logger              // встраивание
    db *sql.DB
}

s := Service{Logger: Logger{prefix: "[svc]"}}
s.Log("старт")          // продвинутый метод

Что хотят услышать

  • Продвижение полей и методов.
  • Отличие от наследования.
  • Полиморфизм через интерфейсы.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем