Go admite la función init para ejecutar el código de inicialización antes de que comience main(). Al ejecutar el programa, el compilador de Go llama automáticamente a todas las funciones init declaradas en cada paquete, después de inicializar las variables del paquete.
Historia de la cuestión: la necesidad de preparar una vez el estado del paquete antes de su uso.
Problema: el orden de inicialización de init a menudo causa errores ocultos: es difícil controlar exactamente cuándo se ejecutará una función init específica, especialmente con múltiples dependencias entre paquetes.
Solución:
Ejemplo de código:
package example import "fmt" var Cfg string = "default" func init() { fmt.Println("example init") Cfg = "configured" }
Características clave:
¿Se puede definir más de una función init en un mismo archivo?
Sí, se permiten varias funciones init; se llamarán en el orden de su declaración.
¿Qué sucede si el paquete se importa solo indirectamente (a través de _ "package")?
Solo se ejecutarán las funciones init y la inicialización de las variables de ese paquete.
¿Las funciones init pueden devolver un valor o un error?
No. La firma de init es inalterable: func init(), sin parámetros ni valores de retorno.
Un gran proyecto confiaba en funciones init complejas que inicializaban estados globales con dependencias entre paquetes. Esto causaba errores de lanzamiento intermitentes.
Ventajas:
Desventajas:
Init se utiliza solo para tareas básicas o específicas de pruebas, el resto se da en funciones explícitas que se llaman desde main(). El orden de ejecución es evidente, y es fácil de probar.
Ventajas:
Desventajas: