La fonction `init`
Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 56 sur 68.
La fonction init est une fonction spéciale en Go qui s'exécute automatiquement lorsqu'un package est importé. Contrairement aux fonctions régulières, vous n'appelez pas init directement - Go l'exécute pour vous pendant le processus d'initialisation du package.
Voici comment définir une fonction init :
package mypackage
import "fmt"
func init() {
fmt.Println("Package mypackage is being initialized!")
}La fonction init possède des caractéristiques uniques : elle ne prend aucun paramètre, ne retourne aucune valeur et s'exécute avant que la fonction main ne commence. Cela la rend parfaite pour configurer l'état initial, enregistrer des composants ou effectuer des tâches de configuration ponctuelles dont votre package a besoin.
Lorsque vous importez un paquet qui contient une fonction init, vous verrez ses effets immédiatement, même si vous n'utilisez aucune des fonctions exportées du paquet. C'est pourquoi le modèle d'importation avec l'identificateur blanc que vous avez appris précédemment est si utile - il vous permet de déclencher l'initialisation d'un paquet sans utiliser directement son code.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Défi
FacileCréez un système d'initialisation de paquets qui démontre comment les fonctions init s'exécutent automatiquement lorsque les paquets sont importés. Vous allez construire un système de journalisation où différents paquets s'initialisent eux-mêmes et suivent leur séquence de démarrage.
Vous recevrez deux entrées :
- Une chaîne contenant les définitions des paquets au format
"package1:message1,package2:message2,package3:message3"(par exemple,"database:Database connection pool initialized,cache:Cache system ready,logger:Logging system started") - Une chaîne contenant les opérations du programme principal au format
"operation1,operation2,operation3"(par exemple,"start_server,process_requests,shutdown")
Votre tâche consiste à :
- Analyser la première entrée en la divisant par les virgules pour obtenir les définitions individuelles des paquets
- Pour chaque définition de paquet, diviser par les deux-points pour obtenir le nom du paquet et le message d'initialisation
- Créer une slice globale appelée
initLogpour suivre les messages d'initialisation - Créer une fonction appelée
logInitqui prend un nom de paquet et un message, puis ajoute le message formaté"[INIT] [package_name]: [message]"à la sliceinitLog - Simuler l'initialisation des paquets en appelant
logInitpour chaque paquet dans l'ordre où ils apparaissent dans l'entrée - Afficher l'en-tête de la séquence d'initialisation :
"=== PACKAGE INITIALIZATION SEQUENCE ===" - Afficher chaque message d'initialisation de la slice
initLog - Afficher l'en-tête du programme principal :
"=== MAIN PROGRAM EXECUTION ===" - Afficher :
"All packages initialized successfully" - Analyser la deuxième entrée en la divisant par les virgules pour obtenir les opérations individuelles
- Pour chaque opération dans le programme principal :
- Afficher :
"Executing: [operation]" - Ajouter un message au journal :
"[MAIN] Operation: [operation]" - Afficher le résumé de l'exécution :
"=== EXECUTION SUMMARY ===""Packages initialized: [number_of_packages]""Main operations executed: [number_of_operations]""Total log entries: [total_number_of_log_entries]"- Afficher le journal complet :
"=== COMPLETE EXECUTION LOG ==="- Afficher chaque entrée du journal complet (à la fois les messages d'initialisation et les opérations principales)
- Afficher le message final :
"Program execution completed - all init functions ran before main"
Utilisez le paquet strings pour diviser les chaînes d'entrée et le paquet fmt pour la sortie formatée. Ce défi démontre comment les fonctions init s'exécutent automatiquement lors de l'importation d'un paquet et s'exécutent toujours avant la fonction main, ce qui les rend parfaites pour les tâches de configuration et d'initialisation des paquets.
Aide-mémoire
La fonction init est une fonction spéciale en Go qui s'exécute automatiquement lorsqu'un paquet est importé :
package mypackage
import "fmt"
func init() {
fmt.Println("Package mypackage is being initialized!")
}Caractéristiques principales des fonctions init :
- Ne prend aucun paramètre et ne retourne aucune valeur
- S'exécute automatiquement pendant l'initialisation du paquet
- S'exécute avant le début de la fonction
main - Idéal pour configurer l'état initial et les tâches de configuration uniques
- Se déclenche même avec des importations d'identifiants vides (blank identifier)
Essayez vous-même
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
// Tranche globale pour suivre les messages d'initialisation
var initLog []string
func main() {
reader := bufio.NewReader(os.Stdin)
// Lire l'entrée (bufio gère correctement les lignes avec des espaces)
packageDefs, _ := reader.ReadString('\n')
packageDefs = strings.TrimRight(packageDefs, "\r\n")
mainOps, _ := reader.ReadString('\n')
mainOps = strings.TrimRight(mainOps, "\r\n")
// TODO: Écrivez votre code ci-dessous
// 1. Analyser packageDefs en divisant par "," pour obtenir les entrées de paquets individuelles
// 2. Pour chaque entrée, diviser par ":" (max 2 parties) pour obtenir packageName et message
// 3. Créer une fonction logInit(packageName, message string) qui ajoute
// "[INIT] [packageName]: message" à la tranche globale initLog
// 4. Afficher l'en-tête de la séquence d'initialisation et toutes les entrées du journal d'initialisation
// 5. Afficher l'en-tête d'exécution principale et traiter chaque opération de mainOps
// - Imprimer "Executing: <op>" pour chaque opération
// - Ajouter "[MAIN] Operation: <op>" à initLog
// 6. Afficher le résumé de l'exécution (nombre de paquets, nombre d'opérations, total des entrées du journal)
// 7. Afficher le journal complet et le message final d'achèvement
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique & Flux
1Structures de contrôle avancées
Switch avec `fallthrough`Sortir de boucles imbriquéesContinuer une boucle spécifiqueL'instruction `goto`Récapitulatif - Contrôle de boucle avancé4Projet : Liste de tâches simple
Configuration du projetAjouter une tâche2Structures et Méthodes
Définir des méthodes sur des structuresReceveurs par valeurReceveurs par pointeurChoisir les receveursMéthodes vs FonctionsRécapitulatif - Comportement des structures5Les Maps en profondeur
Maps de StructsPointeurs comme valeurs de MapTester les Maps NilComparer des MapsRécapitulatif - Compteur de fréquence de mots3Interfaces (Les bases)
Qu'est-ce qu'une Interface ?Définir une InterfaceImplémenter une InterfaceUtiliser les types d'InterfaceInterface videAssertions de typeType SwitchRécapitulatif - Formes et comportements