Closures
Un closure es un valor de función que hace referencia a variables fuera de su propio cuerpo. makeMultiplier devuelve una nueva función cada vez que se llama, y cada función devuelta recuerda su propio factor, capturado desde el momento en que fue creada.
main.go
Pruébalo tú mismo →package main
import "fmt"
func makeMultiplier(factor int) func(int) int {
return func(n int) int {
return n * factor
}
}
func main() {
double := makeMultiplier(2)
triple := makeMultiplier(3)
fmt.Println(double(5))
fmt.Println(triple(5))
}Output
10 15
Los closures pueden contener estado mutable
Un closure no solo lee las variables capturadas — también puede modificarlas, y esa modificación persiste entre llamadas. La variable count de makeCounter sigue viva dentro del closure devuelto, incrementándose cada vez que se llama a next().
main.go
Pruébalo tú mismo →package main
import "fmt"
func makeCounter() func() int {
count := 0
return func() int {
count++
return count
}
}
func main() {
next := makeCounter()
fmt.Println(next())
fmt.Println(next())
fmt.Println(next())
}Output
1 2 3
Siguiente: goroutines — el primitivo de concurrencia ligero e integrado de Go.
Practice exercise
Escribe una función makeAdder(x int) func(int) int que devuelva un closure que suma x a su argumento. Crea addFive := makeAdder(5), luego imprime addFive(10).