Что такое полиморфизм в Go и как он реализуется?

Ответ

Полиморфизм — это способность функции обрабатывать данные разных типов единообразно. В 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 может работать с ними обоими, демонстрируя полиморфизм.