Maison > développement back-end > Golang > Connaissez-vous la signification et l'utilisation des fermetures en golang ?

Connaissez-vous la signification et l'utilisation des fermetures en golang ?

藏色散人
Libérer: 2020-12-24 15:25:42
avant
2371 Les gens l'ont consulté

La colonne suivante du gtutoriel olang vous présentera la signification et l'utilisation des fermetures en golang. J'espère qu'elle sera utile à vos amis. besoin!

Connaissez-vous la signification et l'utilisation des fermetures en 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. Cette fonction peut accéder et attribuer des valeurs à la variable référencée ; en d'autres termes, la fonction est « liée » à la variable.

Ma compréhension peu fiable, Une fermeture est équivalente à une instance d'une classe, et 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) ; la fermeture, la fonction devient La valeur d'une variable est déterminée Tant que la variable n'est pas libérée, la fonction restera vivante et exclusive, donc la valeur de la variable dans la fonction pourra être modifiée ultérieurement (car de cette façon la mémoire ne sera pas récupéré par Go et sera toujours mis en cache là-bas).

La principale signification 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() possède sa propre somme indépendante, qui peut être visualisée sous les noms myAdder1.sum et myAdder2.sum.

Vous pouvez utiliser des sacs à dos pour implémenter des fonctions avec leurs propres états !

package mainimport (
	"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

Exemple

Utiliser la fermeture pour implémenter la séquence de Fibonacci

package mainimport (
	"fmt")func fibonacci() func() int {
	b0 := 0
	b1 := 1
	return func() int {
		tmp := b0 + b1
		b0 = b1
		b1 = tmp		return b1	}}func main() {
	myFibonacci := fibonacci()
	for i := 1; i <= 5; i++ {
		fmt.Println(myFibonacci())
	}}
Copier après la connexion

Résultat :

1
2
3
5
8
Copier après la connexion

Erreurs faciles

func B() []func() {
	b := make([]func(), 3, 3)
	for i := 0; i < 3; i++ {
		b[i] = func() {
			fmt.Println(i)
		}
	}
	return b}func main() {
	c := B()
	c[0]()
	c[1]()
	c[2]()}
Copier après la connexion

Résultat :

// 因为都引用i,i最后变成了3
3
3
3
Copier après la connexion

Méthode de correction 1 :

package mainimport (
	"fmt")func B() []func() {
	b := make([]func(), 3, 3)
	for i := 0; i < 3; i++ {
		j := i
		b[i] = func() {
			fmt.Println(j)
		}
	}
	return b}func main() {
	c := B()
	c[0]()
	c[1]()
	c[2]()}
Copier après la connexion

Méthode de correction 2 :

package mainimport (
	"fmt")func B() []func() {
	b := make([]func(), 3, 3)
	for i := 0; i < 3; i++ {
		b[i] = func(j int) func(){
			return func() {
				fmt.Println(j)
			}
		}(i)
	}
	return b}func main() {
	c := B()
	c[0]()
	c[1]()
	c[2]()}
Copier après la connexion

Pour plus d'articles techniques connexes, veuillez visiter la colonne du didacticiel go langage !

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:csdn.net
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