Наследование
Наследование (wiki англ. inheritance) — концепция объектно-ориентированного программирования, согласно которой абстрактный тип данных может наследовать данные и функциональность некоторого существующего типа, способствуя повторному использованию компонентов программного обеспечения.
Как такового наследования в Go нет, но похожего поведения можно добиться через встраивание (embedding).
Рассмотрим на примере. Допустим у нас есть репозиторий UserStorage и ItemStorage с методом GetAll, отвечающий за получение всех записей.
Оба репозитория будут иметь практически одинаковый код, в каждом репозитории код повторяется. Чтобы предотвратить написание одного и того же шаблонного кода воспользуемся полиморфизмом через интерфейсы, создадим сущность DAO (document access object) с универсальным методом getAll.
Внимание! Код не является рабочим, в нем допущены некоторые упрощения.
Воспользуемся встраиванием и используем метод getAll.
Самое время протестировать код!
Как видим в строке 44 и 63, мы обратились к методу getAll как к собственному методу. Но в этом случае мы могли обойтись и композицией.
Рабочий код ты можешь найти в репозитории по ссылке. Вместо объекта DAO выступает объект SQLAdapter.
При встраивании какого-либо объекта в структуру на самом деле создается еще одно поле по имени типа.
То есть у нас есть доступ к функционалу объекта как из дочернего объекта, так и по обращению к полю объекта. При декларации с помощью литерала структуры нам так же придется указывать поле типа.