Goでクロージャを使用する利点は何
Go言語におけるクロージャとは、ある関数値が自身の関数本体の外部で定義された変数を参照することだ。クロージャ関数は、それが参照する変数にアクセスしたり変更したりすることができ、たとえそのクロージャ関数が定義されたスコープがすでに終了していてもだ。
・関数のネスト
- 関数を返り値として返すこと:クロージャでは中の関数を返り値として返すという挙動がとれるため、関数を返すことが可能になる。これは関数の合成やカリー化などを実現する上で便利な機能であり、関数型言語では一般的なテクニックである。
- 保存状態:クロージャ関数は、参照している変数の状態を保持できます。クロージャ関数を呼び出すたびに、関数のパラメータやローカル変数のスコープの影響を受けずにこれらの状態を変更したり、アクセスしたりできます。
- カプセル化された関数を導入:クロージャ関数は内部関数をプライベートとして定義でき、外部からは直接アクセスできません。これにより、補助関数やツール関数をカプセル化して、必要なインターフェースのみを公開できます。
以下に、クロージャの実用例を示す簡単な例を示します。
func addGenerator() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
add := addGenerator()
fmt.Println(add(1)) // 输出 1
fmt.Println(add(2)) // 输出 3
fmt.Println(add(3)) // 输出 6
}
上記の例で、addGenerator() 関数は外部変数 sum を参照したクロージャ関数を返します。クロージャ関数は呼び出される度に sum の値を変更し、加算後の結果を返します。このようにして、シンプルな累算器を実装します。