Skip to content

Интерфейсы в Go: полиморфизм

Полиморфизм — это одна из ключевых функций, предоставляемых интерфейсами, и это важная особенность Go.

Когда неинтерфейсное значение t типа T заключено в интерфейсное значение i type I, вызов метода, указанного интерфейсным типом I для интерфейсного значения, фактически i вызовет соответствующий метод, объявленный для неинтерфейсного типа и неинтерфейсного значения. Вызов метода значения интерфейса фактически вызовет соответствующий метод динамического значения интерфейса. Например, вызов метода вызовет метод на самом деле. Когда в значение интерфейса заключены разные динамические значения разных динамических типов, значение интерфейса ведет себя по-разному. Это называется полиморфизмом. Tti.mt.m 

При i.m вызове метода таблица методов в информации о реализации, хранящейся в i, будет просматриваться, чтобы найти и вызвать соответствующий метод t.m. Таблица методов представляет собой срез, а поиск — это просто индексация элементов среза, так что это происходит быстро.

Пример:

Самое время протестировать код!

Выход:

В приведенном выше примере полиморфизм делает ненужным написание одной filterAndPrint функции для каждого типа фильтра.

Помимо вышеупомянутого преимущества, полиморфизм также позволяет разработчикам пакета библиотечного кода объявить экспортируемый тип интерфейса и объявить функцию или метод, которые имеют параметр типа интерфейса, так что пользователь пакета может объявить тип, который реализует тип интерфейса в пользовательском коде и передает аргументы пользовательского типа в вызовы функции или метода. Разработчикам пакета кода не нужно заботиться о том, как объявлен пользовательский тип, если он удовлетворяет поведению, заданному типом интерфейса, объявленным в пакете кода библиотеки.

Полиморфизм не является существенным свойством языка. Существуют альтернативные способы выполнения той же работы, такие как функции обратного вызова. Но способ полиморфизма чище и элегантнее.