En eso de revisar la sintaxis y echar algunas líneas de código ultra básico, llegué al tema de "closures". Googleando sobre el asunto, llegué a escribir este ejemplo que creo sirve para explicar bastante bien el como se implementan en Go:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import("fmt") | |
func main() { | |
a := 3 | |
double := func() int { | |
a = a*2 | |
return a | |
} | |
fmt.Println(double()) //6 | |
fmt.Println(double()) //12 | |
} |
En el cuerpo de la función estamos manipulando la variable a cuya declaración pertenece al ámbito en el que se está declarando la función anónima, a no es una variable local a la función.
También podemos ver que la función anónima ha sido asignada a la variable double, es decir double se comporta con un apuntador a la función anónima y nos servirá para invocar la función que, como dije, no tiene nombre.
Finalmente, invocamos a la función a través de la variable double y vemos el efecto en los comentarios. Los resultados nos indican claramente que la función anónima guarda una referencia a la variable a, incluso luego que es invocada por primera vez y ha retornado.
La promesa del lenguaje es que ésta referencia seguirá siendo válida en tanto sea posible invocar a la función anónima.
Espero que esta breve explicación les resulte de utilidad, yo seguiré explorando este lenguaje que me parece muy interesante sobre todo por la sintaxis parecida al C y porque contiene muchos conceptos modernos de los cuales espero escribir pronto.