Qu'est-ce qu'une fermeture ?
Une fonction Go peut être une fermeture. Une fermeture est une valeur de fonction qui fait référence à une variable en dehors du corps de la fonction. (Apprentissage recommandé : go)
Cette fonction peut accéder et attribuer des valeurs à la variable référencée en d'autres termes, cette fonction est "liée" à celle-ci ; variable supérieure.
Ma compréhension peu fiable est qu'une fermeture est équivalente à une instance d'une classe et que les variables en dehors du corps de la fonction sont équivalentes aux variables stockées dans cette instance.
Lorsqu'il n'y a pas de fermeture, la fonction est une transaction unique. Une fois la fonction exécutée, la valeur de la variable dans la fonction ne peut pas être modifiée (la mémoire doit être libérée
Avec fermeture La fonction devient la valeur d'une variable. Tant que la variable n'est pas libérée, la fonction sera toujours vivante et exclusive, donc la valeur de la variable dans la fonction peut être modifiée ultérieurement (car de cette façon la mémoire ne sera pas récupéré par Go, qui y sera toujours mis en cache).Le sens principal de la fermeture
Réduire la portée des variables et réduire la pollution des variables globales. Si l'accumulation suivante est mise en œuvre à l'aide de variables globales, les variables globales seront facilement contaminées par d'autres. En même temps, si je veux implémenter n accumulateurs, j'ai besoin de n variables globales à chaque fois. À l'aide du sac à dos, chaque accumulateur généré myAdder1, myAdder2 := adder(), adder() a sa propre somme indépendante. La somme peut être considérée comme myAdder1.sum et myAdder2.sum. Utilisez le sac à dos pour implémenter des fonctions avec leurs propres états !package main import ( "fmt" ) func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum } } func main() { myAdder := adder() // 从1加到10 for i := 1; i <= 10; i++ { myAdder(i) } fmt.Println(myAdder(0)) // 再加上45 fmt.Println(myAdder(45)) }
Résultat :
55// 1+...+10 100
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!