Dans Go, les fonctions anonymes avec des paramètres passés peuvent se comporter différemment des fermetures. Cet article approfondit la distinction et ses implications.
Exemple de fermeture :
func main() { done := make(chan bool, 1) go func() { time.Sleep(50 * time.Millisecond) done <- true }() <-done }
Dans cette fermeture, la fonction anonyme n'a aucun paramètre et accède à la place au canal terminé présent dans la portée environnante.
Exemple de paramètre :
func main() { done := make(chan bool, 1) go func(c chan bool) { time.Sleep(50 * time.Millisecond) c <- true }(done) <-done }
Dans ce cas, la fonction anonyme prend un paramètre, c, qui est un canal, et interagit directement avec lui.
Quand utiliser les paramètres
La transmission de paramètres à une fonction anonyme est principalement bénéfique dans les scénarios où le partage de variables peut conduire à un comportement inattendu. Prenons l'exemple suivant :
for i := 0; i < 3; i++ { go func() { fmt.Println(i) }() // Closure }
Ici, la fonction anonyme est une fermeture, c'est-à-dire qu'elle fait référence à la variable i définie dans la boucle for. Comme toutes les goroutines partagent la même variable i, elles imprimeront "3" (la valeur finale de i une fois la boucle terminée), même si on peut s'attendre à ce qu'elles impriment "0", "1" et "2".
Pour résoudre ce problème, nous pouvons passer i en paramètre :
for i := 0; i < 3; i++ { go func(v int) { fmt.Println(v) }(i) // Parameter }
Maintenant, chaque goroutine reçoit une copie de la variable i lorsque la fonction est appelée, ce qui donne le résultat correct : "0", "1" et "2".
Conclusion
Bien que les fermetures permettent un accès pratique aux variables dans la portée environnante, la transmission de paramètres offre plus de contrôle et garantit un comportement prévisible lorsqu'il s'agit de variables partagées, en particulier dans des scénarios simultanés.
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!