Skip to content

Значения функции

Как упоминалось ранее, тип функции — это один из типов в Go. Значение типа функции называется значением функции. Нулевые значения типов функций представлены предварительно объявленным nil.

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

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

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

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

Пример:

В приведенном примере g(6, Double) и Apply(6, f) эквивалентны.

На практике мы часто назначаем анонимные функции функциональным переменным, так что мы можем вызывать анонимные функции несколько раз.

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

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