Функции в Go
Из этой главы ты узнаешь:
-
что такое функция, ее параметры и типы переменных;
-
что такое сигнатура функций;
-
как объявлять и вызывать функции;
-
как использовать вызовы функций в качестве выражений.
Что такое функция
На самом деле функция — это один из видов первоклассных типов граждан в Go. Мы можем использовать функции как значения. Хотя Go — статический язык, функции Go очень гибкие. Ощущения от использования функций Go очень похожи на использование многих динамических языков.
В Go есть несколько встроенных функций. Эти функции задокументированы в стандартных builtin пакетах unsafe. Встроенные функции несколько отличаются от пользовательских.
Сигнатуры и типы функций
Литерал функционального типа состоит из ключевого слова func и литерала сигнатуры функции. Сигнатура функции состоит из двух списков типов, один из которых представляет собой список типов входных параметров, а другой — списки типов выходных результатов. Имена параметров и результатов могут появляться в типах функций и литералах сигнатур, но имена не важны.
На практике ключевое слово func может быть представлено либо не представлено в сигнатурных литералах. По этой причине мы можем рассматривать тип и сигнатуру функции как одно и то же понятие.
На скриншоте показан литерал функционального типа.
Последовательные параметры и результаты одного типа могут быть объявлены вместе. Таким образом, приведенный выше литерал эквивалентен.
Поскольку имена параметров и имена результатов не важны в литералах, пока нет повторяющихся непустых имен, приведенные выше литералы эквивалентны следующему.
Имена переменных — параметров и результатов — могут быть пустыми идентификаторами _. Приведенные выше литералы эквивалентны следующему.
Имена параметров должны быть либо только присутствующими, либо только отсутствующими (анонимными). То же правило действует для имен результатов. Приведенные выше литералы эквивалентны следующим.
Все приведенные выше литералы типа функции обозначают один и тот же (безымянный) тип функции.
Каждый список параметров должен быть заключен в () литерал, даже если список параметров пуст. Если список результатов функционального типа пуст, то его можно не включать в литерал функционального типа. Когда в списке результатов содержится не более одного результата, список результатов не нужно заключать в (), если литерал списка результатов не содержит имен результатов.
Вариативные параметры и типы переменных функций
Последний параметр функции может быть переменным. Каждая функция может иметь не более одного вариационного параметра. Тип вариационного параметра всегда является типом среза. Чтобы указать, что последний параметр является вариативным, просто добавь три точки . . . к типу элемента его типа (среза) в его объявлении. Пример:
Тип функции с вариативным параметром можно назвать вариативным типом функции. Вариативный и невариативный типы функции абсолютно не идентичны.
Типы функций — несравнимые типы
В различных источниках о Go есть информация, что типы функций несравнимы. Но, как и значения Map и Slices, значения функций можно сравнивать с не типизированным голым идентификатором nil.
Поскольку типы функций являются несравнимыми типами, их нельзя использовать в качестве ключевых типов типов карт.
Сигнатура функций
Сигнатура функции состоит из имени функции и типа функции (или сигнатуры). Его литерал состоит из ключевого слова func, имени функции и литерала сигнатуры функции.
Пример литерала сигнатуры функции показан на скриншоте.
Сигнатура функции — это объявление функции без части тела. Объявление функции состоит из сигнатуры и тела функции.
Подробнее о несравнимых типах и сигнатуре функций ты можешь узнать по ссылке.