Читаю урок по анонимным функциям:
Преимуществом анонимных функций является то, что они имеют доступ к окружению, в котором они определяются. Здесь функция square определяет локальную переменную x и возвращает анонимную функцию. Анонимная функция увеличивает значение переменной x и возвращает ее квадрат. Таким образом, мы можем зафиксировать у внешней функции square состояние в виде переменной x, которое будет изменяться в анонимной функции.
Хорошо, то есть, анонимная функция будет иметь какой-то хитрый доступ к переменной x, существующей в функции square(). Надо это проверить, и вызвать square() между вызовами анонимной функции.
И что можно увидеть?
Код:
package main
import "fmt"
func square() func() int {
	var x int = 2
	fmt.Println("X variable in square function ", x)
	return func() int {
		x++
		return x * x
	}
}
func main() {
	f := square()
	fmt.Println(f())
	fmt.Println(f())
	square() // <---------- Проверка
	fmt.Println(f())
	fmt.Println(f())
}
Результат:
X variable in square function  2
9
16
X variable in square function  2
25
36
Получается, что анонимная функция не работает с переменной x, размещенной в square(). Происходит какое-то копирование переменной, и потом работа идет с этой копией. То есть, реальность для переменной x «расщепляется»: Внутри square() у нее одно значение, а при вызове анонимной функции - другое.
Как это можно понять? Как это можно уложить в голове? Как этим можно пользоваться?
















