Назад к вопросам
Middle
147
questionbank
Как реализован полиморфизм в языке программирования Go?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В Go полиморфизм реализуется через интерфейсы.
Интерфейс определяет набор сигнатур методов. Тип реализует интерфейс, если он имеет все методы, определенные в интерфейсе, с совпадающими сигнатурами. Реализация не требует явного указания (implements как в Java).
Пример:
// Shape - интерфейс, определяющий метод Area()
type Shape interface {
Area() float64
}
// Circle - структура, реализующая интерфейс Shape
type Circle struct {
radius float64
}
// Area - метод для Circle
func (c Circle) Area() float64 {
return 3.14 * c.radius * c.radius
}
// Rectangle - структура, реализующая интерфейс Shape
type Rectangle struct {
width, height float64
}
// Area - метод для Rectangle
func (r Rectangle) Area() float64 {
return r.width * r.height
}
// Функция, принимающая интерфейс Shape
func printArea(s Shape) {
fmt.Println("Area:", s.Area())
}
// is invoked with different concrete types
func main() {
circle := Circle{radius: 5}
rectangle := Rectangle{width: 10, height: 5}
printArea(circle) // Выводит Area: 78.5
printArea(rectangle) // Выводит Area: 50
// Через слайс интерфейсов
shapes := []Shape{circle, rectangle}
for _, shape := range shapes {
printArea(shape)
}
}
Основные аспекты:
- Интерфейсы: Определяют поведение.
- Неявная реализация: Тип автоматически реализует интерфейс, если соответствует его сигнатурам.
- Утиная типизация (похоже на): "Если оно крякает как утка и ходит как утка, то это утка". Поведение определяет тип.
- Полиморфные функции: Функции могут принимать аргументы типа интерфейса, работая с любым типом, реализующим этот интерфейс.
- Встроенный полиморфизм: Базовая форма полиморфизма также проявляется в функциях, работающих с разными типами данных (например, встроенные функции
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.