Skip to content

Подробнее об объявлениях и вызовах функций

Функции, имена которых могут повторяться

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

  1. Одним исключением является то, что каждый пакет кода может объявлять несколько функций с одним и тем же именем init и одним и тем же типом func().

  2. Другим исключением является то, что несколько функций могут быть объявлены с именами в качестве пустого идентификатора _, и в этом случае объявленные функции никогда не могут быть вызваны.

Подробнее о вызове функций и функции init ты можешь узнать по ссылке.

Некоторые вызовы функций оцениваются во время компиляции

Большинство вызовов функций оцениваются во время выполнения. Но вызовы функций unsafe стандартного пакета всегда оцениваются во время компиляции. Вызовы некоторых других встроенных функций, таких как len и cap, могут выполняться либо во время компиляции, либо во время выполнения, в зависимости от переданных аргументов. Результаты вызовов функций, оцениваемые во время компиляции, могут быть присвоены константам.

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

Все аргументы функции передаются копированием

Повторим еще раз, как и все присвоения значений в Go, все аргументы функций передаются копированием в Go. Когда значение копируется, копируется только его прямая часть (т. е. поверхностная копия).

Подробнее о прямой части ты можешь узнать по ссылке.

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

Мы можем реализовать функцию на ассемблере Go. Исходные файлы сборки Go хранятся в *.a файлах. Функцию, реализованную на ассемблере Go, все равно нужно объявить в *.go файле, но потребуется только сигнатура функции. Часть тела объявления функции должна быть опущена в *.go файле.

Подробнее об ассемблере Go ты можешь узнать по ссылке.

Некоторые функции с результатами не обязаны возвращать значение

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

Результаты вызовов пользовательской функции могут быть отброшены неверно для вызовов некоторых встроенных функций

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

Использование вызовов функций как выражений

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

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

  1. Вызов может использоваться в назначении в качестве исходных значений. Но вызов не может смешиваться с другими исходными значениями в назначении.

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

Пример:

Обрати внимание, что для стандартного компилятора Go некоторые встроенные функции нарушают универсальность только что описанных выше правил.

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