Go Academy · Leçon

defer, fonctions anonymes et fermetures

Appels différés et valeurs de fonction

Leçon 4 sur 412 étapes

defer, fonctions anonymes et fermetures est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.

defer : exécution différée

defer planifie l’appel d’une fonction afin qu’il s’exécute lorsque la fonction environnante se termine — quelle que soit la manière dont elle se termine (normalement, avec une erreur ou par une panique) :

func readFile(path string) {
    f, err := os.Open(path)
    if err != nil { return }
    defer f.Close() // runs when readFile returns
    // read from f...
}

Ordre d’évaluation de defer

Les appels différés sont empilés sur une pile et exécutés dans l’ordre LIFO (dernier entré, premier sorti) :

func main() {
    defer fmt.Println("third")
    defer fmt.Println("second")
    defer fmt.Println("first")
    // Output: first, second, third
}

defer pour le nettoyage

defer est la manière idiomatique de garantir la libération des ressources :

  • Utiliser Unlock après avoir verrouillé un mutex
  • Appeler Close après avoir ouvert un fichier
  • Valider ou annuler une transaction de base de données
  • Appeler WaitGroup.Done() après WaitGroup.Add()

defer avec des arguments

Les arguments d’un appel différé sont évalués immédiatement lorsque defer est appelé, et non au moment de son exécution :

x := 10
defer fmt.Println(x) // prints 10, not 20
x = 20
fmt.Println(x)       // prints 20

Fonctions anonymes

Les fonctions anonymes (littéraux de fonction) sont définies directement, sans nom :

double := func(n int) int {
    return n * 2
}
fmt.Println(double(5)) // 10

// Immediately invoked:
result := func(a, b int) int { return a + b }(3, 4)

Fermetures

Une fermeture est une fonction qui capture des variables de sa portée environnante :

func makeCounter() func() int {
    count := 0
    return func() int {
        count++
        return count
    }
}

ctr := makeCounter()
fmt.Println(ctr(), ctr(), ctr()) // 1 2 3

Piège de capture des fermetures dans les boucles

Les fermetures capturent les variables par référence — un bogue courant dans les boucles de goroutines :

for i := 0; i < 3; i++ {
    i := i // create a new variable per iteration
    go func() { fmt.Println(i) }()
}

defer avec des retours nommés

Les fonctions différées peuvent modifier les valeurs de retour nommées — ce qui est utile pour annoter les erreurs :

func doWork() (err error) {
    defer func() {
        if err != nil {
            err = fmt.Errorf("doWork: %w", err)
        }
    }()
    return riskyOp()
}

Modèles fonctionnels avec des fermetures

Les fermetures permettent des modèles fonctionnels comme la mémoïsation :

func memoize(f func(int) int) func(int) int {
    cache := map[int]int{}
    return func(n int) int {
        if v, ok := cache[n]; ok {
            return v
        }
        v := f(n)
        cache[n] = v
        return v
    }
}

Les fermetures comme intergiciel

Les fermetures sont la base de l’intergiciel dans les serveurs HTTP Go — elles enveloppent un gestionnaire et lui ajoutent un comportement :

func withLogging(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        log.Printf("%s %s", r.Method, r.URL)
        next(w, r)
    }
}

Vérification rapide

Quand les arguments d’un appel de fonction différé sont-ils évalués ?

Récapitulatif : defer, fermetures et fonctions anonymes

Ces fonctionnalités rendent le code Go expressif et sûr :

  • defer garantit le nettoyage à la sortie de la fonction — dans l’ordre LIFO
  • Les arguments de defer sont évalués immédiatement
  • Les fonctions anonymes peuvent être affectées à des variables ou appelées directement
  • Les fermetures capturent les variables environnantes par référence
  • Faites attention aux bogues de capture des variables de boucle dans les goroutines

Cours suivant : tableaux, tranches et tables associatives.

Gratuit pour commencer

Apprends Go avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
51
Leçons
203

Questions Fréquemment Posées

La leçon « defer, fonctions anonymes et fermetures » est-elle gratuite ?

Oui — le texte complet de « defer, fonctions anonymes et fermetures » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « defer, fonctions anonymes et fermetures » ?

Appels différés et valeurs de fonction Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Go Academy ?

Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « defer, fonctions anonymes et fermetures » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?

Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Bases des fonctions et signatures
  2. Valeurs de retour multiples
  3. Fonctions variadiques
  4. defer, fonctions anonymes et fermetures
← Retour à Go Academy