Maison > Article > développement back-end > Pourquoi mon planificateur Go Cron imprime-t-il la description du dernier travail pour tous les travaux ?
Impossible d'attribuer une variable à une fonction anonyme dans une boucle for : un piège de fermeture
En étudiant le go-lang, vous avez rencontré un problème lors du développement d'un planificateur de tâches utilisant la bibliothèque cron. Vous avez remarqué que le planificateur imprimait la description du dernier travail pour tous les travaux planifiés. Ce comportement est dû à l'utilisation de fonctions anonymes dans la boucle for, ce qui conduit à des pièges de fermeture.
Dans Go, la variable val dans une boucle for prend la valeur de chaque élément slice. Lorsque vous utilisez la fermeture dans la boucle, toutes les fermetures sont liées à cette même variable. Étant donné que les goroutines ne s'exécuteront probablement qu'après la boucle, vous finissez par imprimer le dernier élément plusieurs fois.
Pour résoudre ce problème, vous avez tenté de transmettre la tâche en tant que paramètre à la fonction anonyme. Cependant, la bibliothèque cron n'accepte pas les fonctions avec paramètres, car elle attend une fonction de type func().
La solution recommandée est de créer une nouvelle variable pour chaque itération de la boucle. En attribuant le travail en cours à une nouvelle variable (realJob), vous créez une nouvelle portée pour la fermeture, en vous assurant que chaque fermeture a sa propre instance de la variable de travail.
Voici le code corrigé :
for _, job := range config.Jobs { realJob := job c.AddFunc("@every "+realJob.Interval, func() { DistributeJob(realJob) }) log.Println("Job " + realJob.Name + " has been scheduled!") }
En créant une nouvelle variable realJob dans chaque itération de boucle, vous évitez les pièges de la fermeture et vous assurez que chaque tâche planifiée imprime la description correcte.
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!