В Go нет классических для других языков (Java, C++) концепций классов, наследования и виртуальных методов. ООП реализовано через:
- Структуры (Structs): Объединяют данные (поля).
go
- Методы: Функции с ассоциированным получателем (структурой или другим типом). Позволяют структурам иметь поведение.
go
- Получатель по значению: Метод работает с копией структуры. Изменения внутри метода не затрагивают оригинальную структуру.
- Получатель по указателю: Метод работает с оригинальной структурой через указатель. Изменения внутри метода затрагивают оригинальную структуру.
- Интерфейсы (Interfaces): Определяют набор сигнатур методов, которым должен соответствовать тип. Обеспечивают полиморфизм "по утиной типизации" (
duck typing). Тип неявно реализует интерфейс, если реализует все его методы.
go
- Встраивание (Embedding): Позволяет одной структуре "встраивать" другую структуру или интерфейс. Это не наследование в классическом смысле, скорее композиция. Встраиваемая структура становится анонимным полем, к ее полям и методам можно обращаться напрямую через экземпляр встраивающей структуры.
go
| Концепция ООП | Реализация в Go | Замечания |
|---|
| Классы | Структуры | Нет явного ключевого слова class |
| Инкапсуляция | Экспортируемые (с заглавной буквы) / Неэкспортируемые (с маленькой буквы) поля/методы | Управление видимостью на уровне пакета |
| Наследование | Встраивание (Embedding) | Композиция вместо иерархического наследования |
| Полиморфизм | Интерфейсы | Duck typing, неявная реализация интерфейсов |