Анонимные функции - это функции, которым не назначено имя. Они отличаются от обычных функций также тем, что они могут определяться внутри других функций и также могут иметь доступ к контексту выполнения.
Анонимные функции позволяют нам определить некоторое действие непосредственно там, где оно применяется. Например, нам надо выполнить сложение двух чисел, но больше нигде это действие в программе не нужно:
package main import "fmt" func main() { f := func(x, y int) int{ return x + y} fmt.Println(f(3, 4)) // 7 fmt.Println(f(6, 7)) // 13 }
Фактически переменная f определена как:
var f func(int, int) int = func(x, y int) int{ return x + y}
То есть переменной f можно присвоить любую функцию, которая соответствует типу func(int, int) int
.
Очень удобно использовать анонимные функции в качестве аргументов других функций:
package main import "fmt" func action(n1 int, n2 int, operation func(int, int) int){ result := operation(n1, n2) fmt.Println(result) } func main() { action(10, 25, func (x int, y int) int { return x + y }) // 35 action(5, 6, func (x int, y int) int { return x * y }) // 30 }
Анонимная функция может быть результатом друой функции:
package main import "fmt" func selectFn(n int) (func(int, int) int){ if n==1 { return func(x int, y int) int{ return x + y} }else if n==2{ return func(x int, y int) int{ return x - y} }else{ return func(x int, y int) int{ return x * y} } } func main() { f := selectFn(1) fmt.Println(f(2, 3)) // 5 fmt.Println(f(4, 5)) // 9 fmt.Println(f(7, 6)) // 13 }
Преимуществом анонимных функций является то, что они имеют доступ к окружению, в котором они определяются. Например:
package main import "fmt" func square() func() int { var x int = 2 return func() int { x++ return x * x } } func main() { f := square() fmt.Println(f()) // 9 fmt.Println(f()) // 16 fmt.Println(f()) // 25 }
Здесь функция square определяет локальную переменную x и возвращает анонимную функцию. Анонимная функция увеливичает значение переменной x и возвращает ее квадрат.
Таким образом, мы можем зафисировать у внешней функции square состояние в виде переменной x, которое будет изменяться в анонимной функции.