Анонимные функции

Последнее обновление: 26.12.2017

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

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

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, которое будет изменяться в анонимной функции.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850