関数クロージャ

Goの関数はクロージャである可能性があります。クロージャは、その本体の外部から変数を参照する関数値です。この関数は参照された変数にアクセスし、代入することができます。この意味で、関数は変数に「バインド」されています。

例えば、adder関数はクロージャを返します。各クロージャは独自のsum変数にバインドされています。

  1. package main
  2. import "fmt"
  3. func adder() func(int) int {
  4. sum := 0
  5. return func(x int) int {
  6. sum += x
  7. return sum
  8. }
  9. }
  10. func main() {
  11. pos, neg := adder(), adder()
  12. for i := 0; i < 10; i++ {
  13. fmt.Println(
  14. pos(i),
  15. neg(-2*i),
  16. )
  17. }
  18. }