Go prend en charge la fonction init pour exécuter du code d'initialisation avant le début de main(). Lors du lancement d'un programme Go, le compilateur appelle automatiquement toutes les fonctions init déclarées dans chaque paquet, après l'initialisation des variables de paquet.
Historique de la question : nécessité de préparer une fois l'état du paquet avant son utilisation.
Problème : l'ordre d'initialisation de init devient souvent une source d'erreurs implicites : il est difficile de contrôler quand une fonction init particulière sera exécutée, surtout en cas de nombreuses dépendances entre les paquets.
Solution :
Exemple de code :
package example import "fmt" var Cfg string = "default" func init() { fmt.Println("example init") Cfg = "configured" }
Caractéristiques clés :
Peut-on définir plus d'une fonction init dans un même fichier ?
Oui, plusieurs fonctions init sont autorisées — elles seront appelées dans l'ordre de leur déclaration.
Que se passe-t-il si le paquet est importé uniquement de manière indirecte (via _ "package") ?
Seules les fonctions init et l'initialisation des variables de ce paquet seront exécutées.
Les fonctions init peuvent-elles renvoyer une valeur ou une erreur ?
Non. La signature de init est immuable : func init(), sans paramètres ni valeurs de retour.
Un grand projet s'appuyait sur des fonctions init complexes, initialisant des états globaux avec des dépendances entre paquets. Cela causait des erreurs aléatoires au démarrage.
Avantages :
Inconvénients :
Init est utilisé uniquement pour des tâches basiques ou spécifiques aux tests, le reste est déplacé dans des fonctions explicites appelées depuis main(). L'ordre d'exécution est clair, facilité des tests.
Avantages :
Inconvénients :