Maison > développement back-end > Golang > A quoi sert la fermeture Golang ?

A quoi sert la fermeture Golang ?

(*-*)浩
Libérer: 2019-12-27 14:16:55
original
3783 Les gens l'ont consulté

A quoi sert la fermeture Golang ?

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

Résultat :

55// 1+...+10
100
Copier après la connexion

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!

Étiquettes associées:
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal