Вспомним все механизмы ООП и подумаем, есть ли у них аналоги в Go:
✔️ Абстракция
Структуры с полями и методами позволяют описать объект как логически завершённую единицу. Этот механизм даёт возможность строить более сложные абстракции из составных частей.
✔️ Инкапсуляция
Методы структуры с возможностью задать их область видимости (публичные/приватные) позволяют спрятать реализацию под капот, упрощая взаимодействие пользователя с объектом. В Go нет понятия «конструктор объекта», и это может доставить некоторые неудобства пользователю типа. Если тип объекта экспортируемый, пользователь может создать его вручную, минуя написанный «конструктор» NewMyType()
, и получить корректный с точки зрения компилятора объект, но невалидный с точки зрения логики приложения.
✔️ Полиморфизм
Концепция полиморфизма в Go реализуется с помощью интерфейсов. Они позволяют задавать спецификацию типа без привязки к её реализации.
✖️ Наследование
Вложенные структуры не позволяют полностью реализовать механизм наследования. Стандартными средствами (без рефлексии) нельзя проверить, есть ли связь «потомок-родитель» для двух объектов. В Go нет аналога «абстрактного класса», поэтому нельзя взять указатель на базовый тип потомка (к примеру, если функция требует на вход именно базовый тип). Описанные ограничения можно обойти, используя интерфейсы, которые позволяют проверять, реализует ли объект какую-либо спецификацию.
В Go своё видение стандартных механизмов ООП. Упомянутые особенности реализации не ограничивают Go-разработчиков в написании кода — скорее требуют взглянуть на стандарты ООП с другого ракурса.
📂 Go | Последнее изменение: 26.08.2024 19:41