Inicialización de paquetes
Cuando ejecutamos un programa Go, el compilador Go sigue un determinado orden de ejecución para los paquetes, los ficheros de un paquete y la declaración de variables en esos ficheros.
Alcance de paquete
Un alcance es una región en un bloque de código donde una variable definida es accesible. Un ámbito de paquete es una región dentro de un paquete donde una variable declarada es accesible desde dentro de un paquete (a través de todos los archivos del paquete). Esta región es el bloque superior de cualquier archivo del paquete.
Dado que, la sintaxis for
no es válida en el ámbito del paquete, podemos inicializar el array integers
de tamaño 10
utilizando el bucle for
dentro de la función init
.
Alias de paquetes
Cuando se importa un paquete, se crea una variable utilizando la declaración del paquete. Si usted está importando varios paquetes con el mismo nombre, esto dará lugar a un conflicto.
// greet/parent.go
package greetvar Message = "Hey there. I am parent."// greet/greet/child.go
package greetvar Message = "Hey there. I am child."
Por lo tanto, utilizamos alias de paquete. Declaramos un nombre de variable entre la palabra clave import
y el nombre del paquete que se convierte en la nueva variable para hacer referencia al paquete.
En el ejemplo anterior, greet/greet
paquete ahora se hace referencia por child
variable. Si te das cuenta, aliased greet
paquete con un guión bajo.
Underscore es un carácter especial en Go que actúa como null
contenedor. Como estamos importando el paquete greet
pero no lo usamos, el compilador Go se quejará de ello. Para evitar eso, estamos almacenando la referencia de ese paquete en _
y el compilador Go simplemente lo ignorará.
Aliasing un paquete con un guión bajo que parece no hacer nada es bastante útil a veces cuando se quiere inicializar un paquete pero no usarlo.
// greet/parent.go
package greetimport "fmt"var Message = "Hey there. I am parent."func init() {
fmt.Println("greet/parent.go ==> init()")
}// greet/greet/child.go
package greetimport "fmt"var Message = "Hey there. I am child."func init() {
fmt.Println("greet/greet/child.go ==> init()")
}
Lo principal a recordar es que un paquete importado se inicializa sólo una vez por paquete. Por lo tanto, si usted tiene múltiples declaraciones de importación en un paquete, un paquete importado va a ser inicializado sólo una vez en la vida de la ejecución del paquete principal.