Dans Go, les fermetures et les paramètres de fonction fournissent des mécanismes distincts pour gérer les variables au sein des fonctions anonymes. Examinons les nuances et explorons quand une approche est supérieure à l'autre.
Lorsqu'une fonction anonyme agit comme une fermeture, elle conserve l'accès aux variables définies dans la portée environnante. Ces variables sont partagées entre toutes les instances de fermeture, ce qui signifie qu'elles font référence à la même adresse mémoire. Cela peut être avantageux lorsque vous souhaitez que plusieurs appels de fonction opèrent sur les mêmes données, comme le maintien d'un total cumulé ou l'incrémentation d'un compteur.
En revanche, lorsque vous passez un paramètre à une fonction anonyme, la fonction reçoit une copie de la valeur. Cela signifie que chaque instance de la fonction possède sa propre copie distincte de la variable, isolée de la portée appelante. Ceci est avantageux lorsque vous souhaitez que chaque appel de fonction fonctionne indépendamment, sans affecter la valeur d'origine.
Le choix entre utiliser une fermeture ou un paramètre de fonction dépend du comportement souhaité . Si vous avez besoin que tous les appels de fonction partagent la même variable et ses modifications, une fermeture est plus appropriée. D'un autre côté, si chaque appel de fonction doit opérer sur sa propre copie de la variable, un paramètre doit être utilisé.
Pour illustrer cette différence, considérons ce qui suit exemples :
Fermeture :
for i := 0; i < 3; i++ { go func() { fmt.Println(i) }() }
Paramètre :
for i := 0; i < 3; i++ { go func(v int) { fmt.Println(v) }(i) }
Dans l'exemple de fermeture, tous les appels de fonction accédera à la même variable partagée i, qui a une valeur finale de 3 lorsque les goroutines s'exécuteront. Cela entraîne l'impression de la sortie 3 trois fois.
Dans l'exemple du paramètre de fonction, cependant, chaque appel de fonction reçoit une copie de la variable i au moment de l'appel. Par conséquent, la sortie est 0, 1 et 2, car chaque goroutine imprime la valeur de i au moment où elle a été passée en argument.
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!