Go supports anonymous functions, which can form closures. Anonymous functions are useful when you want to define a function inline without having to name it.
package main
import "fmt"
// This function intSeq returns another function
// which we define anonymously in the body of intSeq
// The returned function closes over the variable i to form a closure.
func intSeq() func() int {
i := 0
return func() int {
i++
return i
}
}
func main() {
// We call intSeq, assigning the result
// (a function) to nextInt. This function value
// captures its own i value, which will be updated each time we call nextInt.
nextInt := intSeq()
// See the effect of the closure by calling nextInt a few times.
fmt.Println(nextInt())
fmt.Println(nextInt())
fmt.Println(nextInt())
// To confirm that the state is unique to
// that particular function, create and test a new one.
newInts := intSeq()
fmt.Println(newInts())
}
$ go run closures.go
1
2
3
1
The last feature of functions we’ll look at for now is recursion.
Source | License