Maison  >  Article  >  développement back-end  >  Pourquoi les fonctions anonymes dans les boucles « for » de Go capturent-elles la valeur finale de la variable de boucle ?

Pourquoi les fonctions anonymes dans les boucles « for » de Go capturent-elles la valeur finale de la variable de boucle ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-19 03:49:03780parcourir

Why Do Anonymous Functions in Go's `for` Loops Capture the Final Value of the Loop Variable?

Fonctions anonymes dans les boucles for : comportement inattendu

Dans votre programme Go, vous avez découvert que votre planificateur n'imprime pas le résultat attendu pour chaque travail planifié. Le problème est attribué à l'utilisation de fonctions anonymes dans la boucle for.

Dans une boucle for, la fonction anonyme capture le travail de la variable de boucle à chaque fois que la boucle s'exécute. Cependant, comme il n’existe qu’une seule fonction anonyme, elle utilise la variable job de la dernière itération de la boucle. Cela entraîne l'impression par tous les travaux de la description du dernier travail.

Solution : créer une nouvelle variable pour chaque itération

Pour résoudre ce problème, créez une nouvelle variable pour chaque itération de la boucle. Cela garantira que chaque fonction anonyme capture sa propre valeur unique de la variable de boucle :

for _, job := range config.Jobs {
    realJob := job // a new variable each time through the loop
    c.AddFunc("@every "+realJob.Interval, func() {
        DistributeJob(realJob)
    })
    log.Println("Job " + realJob.Name + " has been scheduled!")
}

Avec cette modification, chaque fonction anonyme aura sa propre copie de la variable de travail, imprimant correctement la description du travail ça représente.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn