Duck-typing в Go
Duck-typing — это про «поведение важнее типа». В Go оно реализовано через интерфейсы и структурную типизацию, но работает не так, как в динамических языках.
Duck-typing опирается на принцип: «если что-то ходит как утка и крякает как утка — значит, это утка».
В терминах кода это означает: если объект реализует нужные методы/поведение, его можно использовать в месте, где ожидается «утка», независимо от его конкретного типа или иерархии наследования.
В Go нет классического наследования и явной привязки типа к интерфейсу через implements , как в Java или C#. Go использует структурную типизацию интерфейсов: если тип имеет все методы интерфейса, он «реализует» этот интерфейс автоматически, без явного объявления.
Рассмотрим на примере ниже.
Есть интерфейс:
type Quacker interface {
Quack()
}
Любой тип с методом Quack() автоматически удовлетворяет Quacker:
type Duck struct{}
func (Duck) Quack() { fmt.Println("quack") }
type Person struct{}
func (Person) Quack() { fmt.Println("I can quack like a duck") }
func MakeItQuack(q Quacker) {
q.Quack()
}
Функции MakeItQuack всё равно, кто именно к ней придет — Duck, Person, *MyRobot, главное, чтобы у значения был метод Quack(). Это и есть «утиная» идея.
Комментарии
0
Ты: ...
Пока нет комментариев. Будь первым.