Menu
Coddy logo textTech

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.

quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

challenge icon

Défi

Facile

Cré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 à :

  1. Analyser la première entrée en la divisant par les virgules pour obtenir les définitions individuelles des paquets
  2. Pour chaque définition de paquet, diviser par les deux-points pour obtenir le nom du paquet et le message d'initialisation
  3. Créer une slice globale appelée initLog pour suivre les messages d'initialisation
  4. Créer une fonction appelée logInit qui prend un nom de paquet et un message, puis ajoute le message formaté "[INIT] [package_name]: [message]" à la slice initLog
  5. Simuler l'initialisation des paquets en appelant logInit pour chaque paquet dans l'ordre où ils apparaissent dans l'entrée
  6. Afficher l'en-tête de la séquence d'initialisation : "=== PACKAGE INITIALIZATION SEQUENCE ==="
  7. Afficher chaque message d'initialisation de la slice initLog
  8. Afficher l'en-tête du programme principal : "=== MAIN PROGRAM EXECUTION ==="
  9. Afficher : "All packages initialized successfully"
  10. Analyser la deuxième entrée en la divisant par les virgules pour obtenir les opérations individuelles
  11. Pour chaque opération dans le programme principal :
    • Afficher : "Executing: [operation]"
    • Ajouter un message au journal : "[MAIN] Operation: [operation]"
  12. 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]"
  13. 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)
  14. 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

}
quiz iconTestez-vous

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