JuniorТеорияЧастоЕщё не отвечали
Что такое замыкание в Go и как оно связано с переменными охватывающей области видимости?
Замыкание — это функциональное значение, которое захватывает переменные охватывающей области по ссылке, а не их копии. Оно может читать и изменять эти переменные, и они живут столько, сколько живёт само замыкание, даже после возврата из функции.
- ✗Считать, что замыкание захватывает переменные по значению, делая снимок при создании, а не ссылаясь на живую переменную
- ✗Полагать, что захваченная локальная переменная умирает при возврате функции, а не живёт столько, сколько замыкание
- ✗Путать замыкание с обычной анонимной функцией без доступа к охватывающей области
- →Как Go сохраняет захваченную переменную живой после возврата её функции?
- →Что произойдёт, если два замыкания захватят одну и ту же охватывающую переменную?
Что такое замыкание в Go?
Замыкание — это функциональное значение, которое использует переменные, объявленные вне его тела, в охватывающей области видимости. Ключевая деталь: оно захватывает эти переменные по ссылке, а не копирует их значение.
func makeAdder() func(int) int {
sum := 0
return func(x int) int {
sum += x // читает и изменяет ту же sum
return sum
}
}
Возвращённая функция ссылается на ту же самую переменную sum. Поэтому:
как makeAdder вернулась (компилятор переносит её в heap).
- замыкание может и читать, и изменять захваченную переменную;
- переменная живёт столько, сколько живёт само замыкание — даже после того,
Именно так возвращённая функция хранит состояние между вызовами.