Go на примерах: Замыкания

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

package main
import "fmt"

Эта функция intSeq возвращает другую функцию, которую мы определяем анонимно в теле intSeq. Возвращаемая функция замыкается на переменной i, образуя замыкание.

func intSeq() func() int {
    i := 0
    return func() int {
        i++
        return i
    }
}
func main() {

Мы вызываем intSeq, присваивая результат (функцию) переменной nextInt. Это значение функции захватывает собственное значение i, которое будет обновляться при каждом вызове nextInt.

    nextInt := intSeq()

Посмотрим на эффект замыкания, вызвав nextInt несколько раз.

    fmt.Println(nextInt())
    fmt.Println(nextInt())
    fmt.Println(nextInt())

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

    newInts := intSeq()
    fmt.Println(newInts())
}
$ go run closures.go
1
2
3
1

Следующая тема о функциях, которую мы рассмотрим — рекурсия.

Далее: .