В Golang нет понятия "обычный класс" и "абстрактный класс" в том виде, как они существуют в объектно-ориентированных языках типа Java или C#.
Однако, имитировать их функциональность можно, используя структуры и интерфейсы.
Сходство (используя структуры и интерфейсы в Golang):
Отличие (в контексте Golang):
| Признак | "Обычный класс" (структура с методами) | "Абстрактный класс" (интерфейс + структуры) |
|---|---|---|
| Прямое создание | Можно создать экземпляр структуры. | Нельзя создать экземпляр интерфейса. |
| Реализация методов | Все методы, прикрепленные к структуре, имеют реализацию. | Интерфейс только декларирует методы, но не их реализацию. |
| Наследование | Нет явного наследования в классическом понимании. Можно использовать композицию (встраивание структур). | Интерфейс не наследуется, а реализуется структурами. |
| Обязательность реализации | Нет принуждения к реализации определенного набора методов, кроме тех, которые прикреплены к структуре. | Любая структура, которая "реализует" интерфейс Golang, должна предоставить реализацию всех его методов. |
| Хранение состояния (полей) | Структура может содержать поля данных. | Интерфейс не содержит полей данных. |
Пример имитации:
go
В этом примере Shape выступает как контракт (аналог абстрактного класса или интерфейса в других языках), а Circle и Rectangle - как конкретные реализации (аналоги обычных классов). Мы можем создавать экземпляры Circle и Rectangle, но не можем создать экземпляр Shape напрямую. При этом обе структуры обязаны реализовать методы Area() и Perimeter(), чтобы "реализовать" интерфейс Shape.