Intenté encontrar una explicación precisa de lo que hace la init()
función en Go. Leí lo que dice Effective Go pero no estaba seguro si entendía completamente lo que decía. La oración exacta de la que no estoy seguro es la siguiente:
Y finalmente significa finalmente: init se llama después de que todas las declaraciones de variables en el paquete hayan evaluado sus inicializadores, y esas se evalúen solo después de que todos los paquetes importados se hayan inicializado.
Que all the variable declarations in the package have evaluated their initializers
significa ¿Significa que si declara variables "globales" en un paquete y sus archivos, init () no se ejecutará hasta que se evalúe todo y luego ejecutará todas las funciones init y luego main () cuando se ejecute ./main_file_name?
También leí el libro de Mark Summerfield:
Si un paquete tiene una o más funciones init (), se ejecutan automáticamente antes de que se llame a la función main () del paquete principal.
En mi opinión, init()
solo es relevante cuando ejecutas la intención de ejecutar main () ¿verdad? o el paquete principal. Cualquiera entiende con mayor precisión init()
siéntase libre de corregirme
init()
es una cosa por paquete, creo ... Por lo tanto, ¿significa que si diferentes archivos tienen los suyosinits
, todas las entradas siempre se ejecutan justo antes de que se ejecute main ()? ¿También puede aclararme una cosa, por qué tendría un init () sin main y cómo funciona? ¿Significa que init () es lo último que se ejecutó antes de importar el paquete? De lo contrario, si no se importa y no hay main, el programa nunca se ejecutará ... ¿verdad? (a menos que sea un archivo de prueba, supongo ...)main
, por ejemplo, si necesita inicializar varias variables o cargar algunos archivos o hacer cálculos únicos. ahora, si todo su programa es un paquete que realmente no es necesario, sin embargo, si se trata de varios paquetes, algunos de ellos podrían necesitar una inicialización específica.init
es con una arquitectura enchufable, como con el comandante Cobra . Observe cómoinit
se hace referencia en los ejemplosMira esta foto. :)
import --> const --> var --> init()
Si un paquete importa otros paquetes, los paquetes importados se inicializan primero.
La constante del paquete actual se inicializa entonces.
Las variables del paquete actual se inicializan entonces.
Finalmente,
init()
se llama la función del paquete actual.fuente
Algo que agregar a esto (que habría agregado como comentario pero al momento de escribir esta publicación aún no tenía suficiente reputación)
Al tener múltiples inits en el mismo paquete, todavía no he encontrado ninguna forma garantizada de saber en qué orden se ejecutarán. Por ejemplo tengo:
Ambas
config.go
yrouter.go
contieneninit()
funciones, pero cuando se ejecutarouter.go
la función se ejecuta primero (lo que hace que mi aplicación entre en pánico).Si se encuentra en una situación en la que tiene varios archivos, cada uno con su propio
init()
función tenga en cuenta que no se garantiza que obtenga uno antes que el otro. Es mejor usar una asignación variable como lo muestra OneToOne en su ejemplo. La mejor parte es: esta declaración de variable ocurrirá antes de TODAS lasinit()
funciones en el paquete.Por ejemplo
config.go:
router.go:
independientemente de si
var ConfigSuccess = configureApplication()
existe enrouter.go
oconfig.go
, se ejecutará antes de que se ejecute CUALQUIERAinit()
.fuente
func initialize|loadConfig|connect
separado defunc init
, dejando func init () para cosas básicas (sin pánico). Esta separación también elimina la necesidad del pirateo para garantizar el orden de inicio. Espero ser de ayuda.init()
llamadas dentro de un solo paquete está dictado por cómo se envían al compilador; lago
herramienta ordena los archivos alfabéticamente. A partir de entonces, dentro de un solo archivo se inicializan en orden sintáctico. editado para elección de palabrasAquí hay otro ejemplo: https://github.com/alok87/gobyexample/blob/master/init/init.go
Salida del programa anterior
fuente
Tomemos, por ejemplo, un marco de trabajo o una biblioteca que está diseñando para otros usuarios, estos usuarios eventualmente tendrán un
main function
código para ejecutar su aplicación. Si el usuario importa directamente un subpaquete del proyecto de su biblioteca, entoncesinit
se llamará a ese subpaquete ( una vez ) en primer lugar. Lo mismo para el paquete raíz de la biblioteca, etc.Hay muchas ocasiones en las que puede desear que se ejecute un bloque de código sin la existencia de a
main func
, directamente o no.Si usted, como desarrollador de la biblioteca imaginaria, importa el subpaquete de su biblioteca que tiene una
init
función, se llamará primero y , una vez , no tiene unmain func
pero necesita asegurarse de que algunas variables o una tabla, se inicializará antes de las llamadas de otras funciones.Una cosa buena para recordar y no para preocuparse, es que: el
init
siempre ejecutará una vez por aplicación.init
la ejecución ocurre:init
función del paquete "llamador",main func
,var = [...] or cost = [...]
,Cuando importe un paquete, ejecutará todas sus funciones de inicio, por orden .
Daré un muy buen ejemplo de una función init. Agregará tipos MIME a una biblioteca de go estándar denominada
mime
y una función de nivel de paquete utilizará elmime
paquete estándar directamente para obtener los tipos MIME personalizados que ya se han inicializado en suinit
función:Espero que te haya ayudado a ti y a otros usuarios, ¡no dudes en volver a publicar si tienes más preguntas!
fuente
https://golang.org/ref/mem#tmp_4
fuente
init
se llamará a todas partes que use su paquete (sin importar importación o importación en blanco), pero solo una vez.este es un paquete:
cualquier paquete (paquete principal o paquete de prueba) impórtelo como en blanco:
o importarlo con la función func:
el init registrará
0
solo una vez. el primer paquete que lo usa, su función init se ejecutará antes que el paquete init. Entonces:A llama a B, B llama a C, todos ellos tienen la función init, el init de C se ejecutará primero antes que B, B antes que A.
fuente
Función mutil init en un orden de ejecución de paquete:
const y la función init () de archivo definido variable ejecutar
función init ejecutar orden por el nombre de archivo asc
fuente
El init func se ejecuta primero y luego main. Se usa para configurar algo primero antes de que se ejecute su programa, por ejemplo:
Acceder a una plantilla, ejecutar el programa con todos los núcleos, verificar los Goos y el arco, etc.
fuente