Go Em Exemplos: Closures

Go suporta funções anônimas, as quais podem formar closures. Funções anônimas são úteis quando se pretende definir a função em linha sem ser necessário nomeá-la.

package main
import "fmt"

Esta função intSeq retorna outra função, que é definida anonimamente no corpo de intSeq. A função retornada fecha sobre (closes over) a variavel i para formar um fechamento (closure).

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

Aqui, a execução da função intSeq (que retorna outra função) é atribuída à variável nextInt. Esta função captura o próprio valor de i, que será atualizado a cada vez que é chamada nextInt.

    nextInt := intSeq()

Veja o efeito do closure chamando nextInt algumas vezes.

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

Para confirmar que o estado é único àquela variável específica, ao criar outra e testar, o resultado é diverso.

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

O último recurso de funções a ser apresentado é a recursão.

Próximo exemplo: Recursion.