Ответ
Полиморфизм — это способность функции обрабатывать данные разных типов единообразно. В Go полиморфизм достигается не через наследование классов, как в классических ООП-языках (Java, C++), а через интерфейсы.
Объект удовлетворяет интерфейсу, если он реализует все его методы. Это позволяет писать функции, которые оперируют интерфейсами, а на вход им передавать любые типы, реализующие эти интерфейсы.
Пример:
package main
import "fmt"
// Animal определяет поведение, которое мы ожидаем.
type Animal interface {
Speak() string
}
// Dog - конкретный тип, реализующий интерфейс Animal.
type Dog struct{}
func (d Dog) Speak() string { return "Woof!" }
// Cat - другой конкретный тип, также реализующий Animal.
type Cat struct{}
func (c Cat) Speak() string { return "Meow!" }
// MakeSound работает с любым типом, который удовлетворяет интерфейсу Animal.
func MakeSound(a Animal) {
fmt.Println(a.Speak())
}
func main() {
// Мы можем передать в одну и ту же функцию объекты разных типов.
MakeSound(Dog{}) // Woof!
MakeSound(Cat{}) // Meow!
}
В этом примере Dog
и Cat
— абсолютно разные типы, но поскольку оба реализуют метод Speak()
, они оба удовлетворяют интерфейсу Animal
. Функция MakeSound
может работать с ними обоими, демонстрируя полиморфизм.