Go by Example: Closures

Go soporta funciones anónimas, las cuales pueden formar cierres (closures). Las funciones anónimas son útiles cuando quieres definir una función en línea sin necesidad de nombrarla.

package main
import "fmt"

Esta función intSeq devuelve otra función, la cual definimos de manera anónima en el cuerpo de intSeq. La función devuelta cierra sobre la variable i para formar un cierre (closure).

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

Llamamos a intSeq, asignando el resultado (una función) a nextInt. Este valor de función captura su propio valor de i, el cual será actualizado cada vez que llamemos a nextInt.

    nextInt := intSeq()

Observa el efecto del cierre llamando a nextInt unas cuantas veces.

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

Para confirmar que el estado es único para esa función en particular, crea y prueba una nueva.

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

La última característica de las funciones que veremos por ahora es la recursividad.

Siguiente ejemplo: Recursion.