Golang: Интерфейсы
Интерфейсы определяются как набор сигнатур методов. Методы, объявленные в интерфейсе, не имеют тела (определения).
Давайте изучим эту концепцию на простом примере.
Общий обзор простого примера:
В этом простом примере я определил интерфейс (calculation
) с двумя объявлениями методов (add()
, mul()
). У меня есть 2 типа структур (two_inputs
, variable_inputs
) и я сделал их для реализации этого интерфейса. Когда интерфейс реализуется типом, этот тип можно использовать во всех местах, где требуется этот тип интерфейса. В этом примере у нас есть функция с именем get_calcs()
, которая имеет входной параметр интерфейса типа (calculation
). Таким образом, любой тип, который реализует этот интерфейс (calculation
), может использоваться для вызова этой функции. В нашем случае два типа структур two_inputs
, variable_inputs
реализуют интерфейс calculation
, поэтому их можно использовать для вызова функции get_calcs()
.
Синтаксис:
interface_name interface{
method_1() return_type
}
Теперь мы собираемся сделать эти структуры для реализации интерфейса.
В отличие от Java, Golang неявно реализует интерфейс.
Чтобы реализовать интерфейс в Go, нам просто нужно реализовать все методы интерфейса.
Результат:
Здесь в основной функции мы вызвали функцию get_calcs()
с аргументами в качестве наших двух структур, реализующих интерфейс вычисления.
Реализация интерфейса неявна в Go.
В Java мы будем реализовывать интерфейс явно, используя ключевое слово implements
.
Но в Go такого ключевого слова нет, реализация неявная.
Чтобы доказать это, позвольте мне сделать так, чтобы одна из наших структур (two_inputs или variable_inputs) не реализовывала ни одну функцию, объявленную в интерфейсе.
Я закомментировал функцию add() для two_inputs.
В результате я получил эту ошибку
Что говорит нам о том, что структура two_inputs не реализует все функции, объявленные в интерфейсе. Таким образом, мы не можем использовать тип two_inputs в качестве типа вычисления для функции get_calcs, которая имеет тип calculation.