Closures
#
// Go suporta [_funções anônimas_](https://en.wikipedia.org/wiki/Anonymous_function),
// as quais podem formar
// <a href="https://pt.wikipedia.org/wiki/Clausura_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o)"><em>closures</em></a>.
// 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.