Введение
В этом практическом занятии вы научитесь использовать анонимные функции для создания замыканий в Golang.
Замыкания
Вам нужно создать функцию, которая возвращает другую функцию. Возвращаемая функция должна увеличивать переменную на единицу каждый раз, когда она вызывается. Переменная должна быть уникальной для каждой возвращаемой функции.
- Функция
intSeqдолжна возвращать другую функцию. - Возвращаемая функция должна увеличивать переменную на единицу каждый раз, когда она вызывается.
- Переменная должна быть уникальной для каждой возвращаемой функции.
$ go run closures.go
1
2
3
1
## Последняя особенность функций, которую мы рассмотрим на данный момент, - это
## рекурсия.
Ниже представлен полный код:
// Go поддерживает [анонимные функции](https://en.wikipedia.org/wiki/Anonymous_function),
// которые могут образовывать <a href="https://en.wikipedia.org/wiki/Closure_(computer_science)"><em>замыкания</em></a>.
// Анонимные функции полезны, когда вы хотите определить
// функцию inline, не давая ей имя.
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())
}
Резюме
В этом практическом занятии вы узнали, как использовать анонимные функции для создания замыканий в Golang. Замыкания полезны, когда вы хотите определить функцию inline, не давая ей имя.