defer, fonctions anonymes et fermetures
Appels différés et valeurs de fonction
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 20Fonctions 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 3Piè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 :
defergarantit 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.
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
- Bases des fonctions et signatures
- Valeurs de retour multiples
- Fonctions variadiques
- defer, fonctions anonymes et fermetures