Читаю урок по анонимным функциям:
Преимуществом анонимных функций является то, что они имеют доступ к окружению, в котором они определяются. Здесь функция 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() у нее одно значение, а при вызове анонимной функции - другое.
Как это можно понять? Как это можно уложить в голове? Как этим можно пользоваться?