Проверяет понимание полиморфизма через интерфейсы и динамические типы в Go.
В Go полиморфизм достигается через интерфейсы: переменная интерфейсного типа может содержать значения разных конкретных типов, реализующих этот интерфейс. Go не имеет наследования классов, но интерфейсный полиморфизм и пустой интерфейс interface{} позволяют писать обобщённый и гибкий код.
Интерфейсный полиморфизм:
Любой тип, реализующий методы интерфейса, удовлетворяет ему неявно.
Переменная типа Reader может ссылаться на os.File, bytes.Buffer и др.
Пустой интерфейс:
interface{} принимает значение любого типа.
Часто используется в обобщённых структурах (map[string]interface{}).
Отсутствие наследования:
Go не поддерживает классическое наследование.
Вместо этого — композиция через embedding.
Пример:
type Speaker interface { Speak() string }
type Dog struct{}
func (Dog) Speak() string { return "Woof" }
func Say(s Speaker) { fmt.Println(s.Speak()) }
Say(Dog{}) // Woof