ホームページ  >  記事  >  バックエンド開発  >  golang クロージャーは何に使うのですか?

golang クロージャーは何に使うのですか?

(*-*)浩
(*-*)浩オリジナル
2019-12-27 14:16:553756ブラウズ

golang クロージャーは何に使うのですか?

#クロージャとは何ですか?

Go 関数はクロージャになることができます。クロージャは、関数本体の外側の変数を参照する関数値です。 (推奨学習: go)

この関数は、参照先の変数にアクセスして値を割り当てることができます。つまり、この関数はこれに「バインド」されています。可変の優れた。

私の信頼性の低い理解では、クロージャはクラスのインスタンスに相当し、関数本体の外側の変数はこのインスタンスに格納されている変数に相当します。

クロージャがない場合、関数は 1 回限りのトランザクションです。関数の実行後、関数内の変数の値は変更できません (メモリを解放する必要があります)。

クロージャを使用すると、関数は変数の値になります。変数が解放されない限り、関数は常に有効で排他的であるため、関数内の変数の値は後で変更できます (この方法では、メモリは Go によって再利用されず、常にそこにキャッシュされます)。

クロージャの主な重要性

変数のスコープを縮小し、グローバル変数の汚染を軽減します。次のような蓄積をグローバル変数を使用して実装すると、グローバル変数は他の変数によって簡単に汚染されてしまいます。

同時に、n 個のアキュムレータを実装したい場合は、毎回 n 個のグローバル変数が必要になります。

バックパックを使用すると、生成された各アキュムレータ myAdder1、myAdder2 := adder()、adder() は独自の独立した合計を持ち、合計は myAdder1.sum および myAdder2.sum と見なすことができます。

バックパックを使用して、独自のステータスを持つ機能を実装します。

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

結果:

55// 1+...+10
100

以上がgolang クロージャーは何に使うのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。