Closures

Замыкания (Closures)|Closures #

// Go поддерживает [_анонимные функции_](http://en.wikipedia.org/wiki/Anonymous_function), которые могут образовывать
// <a href="http://en.wikipedia.org/wiki/Closure_(computer_science)"><em>замыкания</em></a>. Анонимные функции полезны, когда вы хотите
// определить встроенную функцию, не называя ее.

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

# Последняя особенность функций, которые мы сейчас
# рассмотрим, - это рекурсия.