AnyCompiler

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.

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().

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).