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

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

藏色散人
藏色散人avant
2020-12-24 15:25:222242parcourir

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))}

Résultat :

55		// 1+...+10
100

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())
	}}

Résultat :

1
2
3
5
8

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]()}

Résultat :

// 因为都引用i,i最后变成了3
3
3
3

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]()}

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]()}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer