Эти функции не имеющие назначенного имени. Они могут определяться в других функциях и могут иметь доступ к контексту выполнения.
Если вам нужно выполнить сложение двух чисел и больше это действие, в программе не нужно. Приведу пример кода:
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 }
Можно проверить в https://play.golang.org
Ответ:
7
13
Поделюсь большим и более сложным примером.
package main import ( "fmt" ) func altera(a int) { a = 2 fmt.Println(a) } func main() { a := 1 fmt.Println(a) // по умолчанию 1 // передается в именованную функцию altera(a) // изменено на 2 fmt.Println(a) // снова 1 // Анонимная функция без передачи func() { a = 3 fmt.Println(a) // изменено на 3 }() fmt.Println(a) // осталось 3 !!! // передается анонимной функции func(a int) { a = 4 fmt.Println(a) // изменено на 4 }(a) fmt.Println(a) // снова 3 }
Они могут быть как аргумент. Они удобно используются в этом качестве.
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 }