Назад к вопросам
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.