Closures

Замикання|Closures #

// [_Анонімні функції_](https://uk.wikipedia.org/wiki/Анонімна_функція) (які підтримуються в Go)
// можуть створювати [_замикання_](https://uk.wikipedia.org/wiki/Замикання_(програмування)).
// Це стає в нагоді, за умов коли необхідно декларувати
// функцію без найменування і поводитись з нею, як з простою змінною.

package main

import "fmt"

// В нашому прикладі функція `intSeq` створює та повертає іншу функцію,
// оголошуну анонімно в тілі `intSeq`. Функція, що
// повертається, замикається на змінні `i` та формує так зване `замикання`
// або `closure`.
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

# Наостанок звернемо увагу на ще одну особливість
# функцій - рекурсію.