Skip to content

Объявление функций и вызовы функций

За исключением операторных операций, представленных в предыдущей главе, функциональные операции — еще один вид популярных операций в программировании. Функциональные операции часто называют вызовами функций. Эта и следующие главы расскажут тебе, как объявлять и вызывать функции.

Объявления функций

Давай рассмотрим объявление функции.

Мы можем обнаружить, что объявление функции состоит из нескольких частей. Слева направо,
Первая часть является func ключевым словом.

  1. Следующая часть — это имя функции, которое должно быть идентификатором. Здесь имя функции — SquareOfSumAndDiff.
  2. Третья часть — это список объявлений входных параметров (аргументов), заключенный в пару ().
  3. Четвертая часть — это список объявлений выходных (или возвращаемых) результатов. Функции Go могут возвращать несколько результатов. Для указанного примера список объявлений результатов также заключен в пару (). Однако, если список пуст или состоит только из одного анонимного объявления результатов, то пара () в списке объявлений результатов является необязательной.
  4. Последняя часть — это тело функции, заключенное в пару {}. В теле функции return ключевое слово используется для завершения нормального прямого потока выполнения и перехода к завершающей фазе вызова функции.

В приведенном выше примере каждое объявление параметра и результата состоит из имени и типа, тип следует за именем. Мы можем рассматривать объявления параметров и результатов как стандартные объявления переменных без var ключевых слов. Объявленная выше функция имеет два параметра — a и b, и имеет два результата — s и d. Все типы параметров и результатов int64. Параметры и результаты обрабатываются как локальные переменные внутри соответствующих тел функций.

Имена в списке возвращаемых данных в объявлении функции могут присутствовать или отсутствовать. Два вида записи используются на практике. Если результат определен с именем, он называется именованным результатом, в противном случае он называется анонимным результатом. Использовать именованный возврат не рекомендуется некоторыми разработчиками, один из сторонников не использовать именованный возврат — Dave Cheney.

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

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

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

Go не поддерживает значения параметров по умолчанию. Начальным значением каждого результата является нулевое значение его типа. Например, следующая функция всегда будет печатать (и возвращать) 0 false.

Если части типов некоторых последовательных параметров в списке объявлений параметров идентичны, то эти параметры могут иметь одну и ту же часть типа в списке объявлений параметров. То же самое справедливо и для списков объявления результатов. Например, приведенные выше два объявления функций с именем SquaresOfSumAndDiff эквивалентны

Обрати внимание, что даже если оба результата названы, ключевое слово return может сопровождаться возвращаемыми значениями.
Важно: 

  • Если список объявлений результатов в объявлении функции содержит только одно анонимное объявление результатов, то список объявлений результатов не нужно заключать в файл ().
  • Если объявление функции не имеет возвращаемых результатов, часть списка объявлений результатов может быть полностью опущена.
  • Часть списка объявлений параметров никогда нельзя опускать, даже если количество параметров объявленной функции равно нулю.

Вот еще примеры объявления функций.

Важно, что функция main является точкой входа в каждой программе написанной на Go, она объявляется без параметров и без возвращаемых результатов.

Обрати внимание, что функции должны быть объявлены непосредственно на уровне пакета. Функция не может быть объявлена в теле другой функции

Вызовы функций

Объявленная функция может быть вызвана через ее имя и список аргументов. Список аргументов должен быть заключен в файл (). Мы часто называем это передачей аргумента или передачей параметра. Каждый аргумент с одним значением соответствует (передается) параметру.

Примечание: передача аргументов также является присвоением значений.

Тип аргумента не обязательно должен быть идентичен соответствующему типу параметра. Единственное требование к аргументу — он должен быть присваиваемым (то есть неявно конвертируемым) соответствующему типу параметра.

О присваивании ты можешь прочесть на сайте go101.

Если функция имеет возвращаемые результаты, то каждый ее вызов рассматривается как выражение. Если он возвращает несколько результатов, то каждый из его вызовов рассматривается как многозначное выражение. Выражение с несколькими значениями может быть присвоено списку целевых значений с одинаковым количеством.

Ниже приведен полный пример, показывающий, как вызывать некоторые объявленные функции.

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

Вызовы функций можно отложить или вызвать в новых горутинах (зеленых потоках) в Go.

Узнать подробнее о горутинах ты можешь по ссылке.