Golang Closures

By | 09/13/2018

Para comprender los closures en Go primero debemos comprender sobre funciones anónimas.

Las funciones anónimas son simplemente funciones que hemos creado sin un nombre y que luego asignamos a una variable o que usamos directamente.

Veamos el ejemplo a continuación en donde hemos asignado una función a la variable “a” . No hay nombre definido para la función y podemos usarla a través de la variable a la cual la función está asignada.

package main

import "fmt"

func main() {
      a := func() {
             fmt.Println("hello golang!")
      }
      a()  // use var a like a funcion
}

También podemos usar una función anónima directamente sin asignarla a una variable de esta manera:

package main

import "fmt"

func main() {
      func() {
             fmt.Println("hello golang!")
      }()
}

Golang Closures

Un Closure es una función anónima que accede a una variable definida fuera de dicha función.

La siguiente función accede a la variable “a”

package main

import "fmt"

func main() {
      a := 1
      func() {
             fmt.Println("value of a: ", a)
      }()
}

Cada Closures es dueño de sus variables. ¿Qué significa esto? Veamos un ejemplo para comprenderlo.

La función “sayHello” devuelve otra función que define y retorna una función anonima en el cuerpo de “sayHello”. La función retornada encierra (closure) la variable “h” .

Observa que asignamos un funciones Closure a dos variables, a y b.
La función asignada a la variable “a” maneja el valor de “h” sin confundirse con el valor en la función asignada a la variable “b”. Dicho de otro modo cada función a y b encierra su variable h.

package main

import "fmt"

func sayHello() func(string) string {
      h := ""
      return func(b string) string {
             h = h + " " +  b
             return h
      }
}

func main() {
      a := sayHello()
      b := sayHello()

      fmt.Println(a("Hello golang"))
      fmt.Println(a("how are you?"))

      fmt.Println(b("Hi!"))
      fmt.Println(b("what up?"))
}

El resultado de esto es:

go run closures.go
 Hello golang
 Hello golang how are you?
 Hi!
 Hi! what up?

Veamos otro ejemplo muy simple. A continuación tenemos una función closure que solo va sumando de dos en dos. Creamos dos variables a y b para dicha función y la ejecutamos.

package main

import "fmt"

func seqOfTwo() func() int {
      i := 0
      return func() int {
             i = i + 2
             return i
      }
}

func main() {
      a := seqOfTwo()
      fmt.Println(a())
      fmt.Println(a())
      fmt.Println(a())

      b := seqOfTwo()
      fmt.Println(b())
      fmt.Println(b())
      fmt.Println(b())
}

El resultado

go run closures2.go
2
4
6
2
4
6

Conclusión:

Has visto en este post que es un closure en golang.

Puedes ver este código en github y gitlab

Compartir esto:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *