Go by Example: Closures

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.

Next example: Recursion.