Maison > développement back-end > Golang > le corps du texte

Quand utiliser les paramètres ou les fermetures dans les fonctions Go Anonymous ?

Barbara Streisand
Libérer: 2024-11-19 05:00:02
original
883 Les gens l'ont consulté

When to Use Parameters vs. Closures in Go Anonymous Functions?

Passer des paramètres aux fermetures de fonctions

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
}
Copier après la connexion

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
}
Copier après la connexion

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
}
Copier après la connexion

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
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal