Cierres de funciones en Go (funciones anónimas)
Go admite funciones anónimas, que pueden usarse como cierres. Una función anónima es una declaración o expresión "en línea". Su ventaja es que puede usar directamente las variables dentro de la función sin tener que declararlas.
Una función anónima es una función sin nombre, generalmente se usa para definir funciones dentro de otra función o para pasarse como parámetro de función.
En el siguiente ejemplo, creamos la función getSequence(), que devuelve otra función. El propósito de esta función es incrementar la variable i dentro del cierre. El código es el siguiente:
Ejemplo
import "fmt"
func getSequence() func() int {
i:=0
return func() int {
i+=1
return i
}
}
func main(){
/* nextNumber es una función, i es 0 */
nextNumber := getSequence()
/* Se llama a la función nextNumber, la variable i se incrementa en 1 y se devuelve */
fmt.Println(nextNumber())
fmt.Println(nextNumber())
fmt.Println(nextNumber())
/* Se crea una nueva función nextNumber1 y se observa el resultado */
nextNumber1 := getSequence()
fmt.Println(nextNumber1())
fmt.Println(nextNumber1())
}
El resultado de ejecutar el código anterior es:
1 2 3 1 2
En el siguiente ejemplo definimos varias funciones anónimas y mostramos cómo asignar una función anónima a una variable, usar funciones anónimas dentro de una función y pasarlas como argumentos a otras funciones.
Ejemplo
import "fmt"
func main() {
// Definir una función anónima y asignarla a la variable add
add := func(a, b int) int {
return a + b
}
// Llamar a la función anónima
result := add(3, 5)
fmt.Println("3 + 5 =", result)
// Usar una función anónima dentro de una función
multiply := func(x, y int) int {
return x * y
}
product := multiply(4, 6)
fmt.Println("4 * 6 =", product)
// Pasar una función anónima como argumento a otras funciones
calculate := func(operation func(int, int) int, x, y int) int {
return operation(x, y)
}
sum := calculate(add, 2, 8)
fmt.Println("2 + 8 =", sum)
// También se puede definir una función anónima directamente en la llamada a una función
difference := calculate(func(a, b int) int {
return a - b
}, 10, 4)
fmt.Println("10 - 4 =", difference)
}
El resultado de ejecutar el código anterior es:
3 + 5 = 8 4 * 6 = 24 2 + 8 = 10 10 - 4 = 6
El uso de funciones anónimas en Go es muy flexible, ayuda a simplificar la estructura del código y mejora la legibilidad.
Otras extensiones
Funciones en Go