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
}
![Объявление интерфейса<br>](/static/storage/116997447792409877545206475770708394431.png)
![Объявление структуры<br>](/static/storage/163790041215903535888510996592526813440.png)
Теперь мы собираемся сделать эти структуры для реализации интерфейса.
В отличие от Java, Golang неявно реализует интерфейс.
Чтобы реализовать интерфейс в Go, нам просто нужно реализовать все методы интерфейса.
![Метод интерфейса add() <br>](/static/storage/30630982368121902052078279657008198168.png)
![Метод интерфейса mul() <br>](/static/storage/127146242010213908636465623763832332410.png)
![Функция для расчета<br>](/static/storage/257303908684795453088299109914927512067.png)
![Основная функция нашего кода<br>](/static/storage/269110192664210156409821213351131940718.png)
Результат:
![](/static/storage/233771889617978535145760874495091553645.png)
Здесь в основной функции мы вызвали функцию get_calcs()
с аргументами в качестве наших двух структур, реализующих интерфейс вычисления.
Реализация интерфейса неявна в Go.
В Java мы будем реализовывать интерфейс явно, используя ключевое слово implements
.
Но в Go такого ключевого слова нет, реализация неявная.
Чтобы доказать это, позвольте мне сделать так, чтобы одна из наших структур (two_inputs или variable_inputs) не реализовывала ни одну функцию, объявленную в интерфейсе.
Я закомментировал функцию add() для two_inputs.
![Удалена функция add() для структуры two_inputs<br>](/static/storage/143742557581479152166743442359070522007.png)
В результате я получил эту ошибку
![Отсутствует добавление метода для типа two_inputs<br>](/static/storage/255109362399367886931020624736835892293.png)
Что говорит нам о том, что структура two_inputs не реализует все функции, объявленные в интерфейсе. Таким образом, мы не можем использовать тип two_inputs в качестве типа вычисления для функции get_calcs, которая имеет тип calculation.