В Go полиморфизм реализуется через интерфейсы.
Интерфейс определяет набор сигнатур методов. Тип реализует интерфейс, если он имеет все методы, определенные в интерфейсе, с совпадающими сигнатурами. Реализация не требует явного указания (implements как в Java).
Пример:
go
Основные аспекты:
- Интерфейсы: Определяют поведение.
- Неявная реализация: Тип автоматически реализует интерфейс, если соответствует его сигнатурам.
- Утиная типизация (похоже на): "Если оно крякает как утка и ходит как утка, то это утка". Поведение определяет тип.
- Полиморфные функции: Функции могут принимать аргументы типа интерфейса, работая с любым типом, реализующим этот интерфейс.
- Встроенный полиморфизм: Базовая форма полиморфизма также проявляется в функциях, работающих с разными типами данных (например, встроенные функции
len, cap, append работают с различными коллекциями).
- Встраивание (Embedding): Позволяет реализовать "композицию вместо наследования", но также может быть использовано для создания типов, которые "получают" методы от других типов, что в некоторой степени напоминает полиморфизм.
Polymorphism in Go is ad-hoc, based on structural typing via interfaces. This differs from classical subtyping polymorphism found in languages with explicit inheritance.