Go por Exemplo: Closures

Go suporta funções anônimas, que podem formar closures. Funções anônimas são úteis quando você deseja definir uma função em linha sem ter que nomeá-lo.

package main
import "fmt"

Essa função intSeq retorna outra função, que definimos anônimamente no corpo do intSeq. A função retornada se fecha sobre a variável i para formar o closure.

func intSeq() func() int {
    i := 0
    return func() int {
        i += 1
        return i
    }
}
func main() {

Chamamos intSeq, atribuindo o resultado (a função) para o nextInt. Esse valor de função captura seu próprio valor i, que será atualizado cada vez que chamamos o nextInt.

    nextInt := intSeq()

Veja o efeito do closure chamando o nextInt algumas vezes.

    fmt.Println(nextInt())
    fmt.Println(nextInt())
    fmt.Println(nextInt())

Para confirmar que o estado é único para essa função particular, crie e teste um novo.

    newInts := intSeq()
    fmt.Println(newInts())
}
$ go run closures.go
1
2
3
1

O último recurso de funções que veremos agora é a recursão.

Próximo exemplo: Recursão.