Sobes.tech
Junior

Quel concept est implémenté avec la construction defer dans le langage Go ?

sobes.tech IA

Réponse de l'IA

La construction defer implémente le concept d'exécution différée d'une fonction. La fonction différée s'exécute juste avant la fin de la fonction qui la contient.

Points clés:

  • Moment d'exécution: La fonction différée s'exécute à la fin de la fonction parente, même en cas de panique ou d'exception.
  • Pile: Les appels différés forment une pile. Le dernier appel différé sera exécuté en premier (LIFO).
  • Capture de variables: Les arguments de la fonction différée sont évalués au moment de la déclaration de defer, pas au moment de l'exécution.

Exemples d'utilisation typique:

  • Fermeture de fichiers, connexions réseau, mutex.
  • Restauration de l'état (par exemple, après modification de variables globales ou de drapeaux).
  • Mesure du temps d'exécution.
// Exemple d'utilisation de defer pour fermer un fichier
func readFile(filename string) error {
	f, err := os.Open(filename)
	if err != nil {
		return err
	}
	defer f.Close() // Le fichier sera fermé avant la sortie de la fonction

	// Lecture du fichier...
	return nil
}
// Exemple de pile d'appels defer
func process() {
	defer fmt.Println("Premier dans la pile")
	defer fmt.Println("Deuxième dans la pile")
	defer fmt.Println("Troisième dans la pile") // S'exécutera en dernier

	fmt.Println("Traitement...")
}

Appels différés avec arguments:

// Exemple de capture de la valeur d'une variable au moment de la déclaration de defer
func demonstrateDeferArgEval() {
	i := 0
	defer fmt.Println("Valeur de i en defer:", i) // i sera 0

	i++
	fmt.Println("Valeur de i après incrément:", i) // i sera 1
}