ぷらこのきろく

メモとかテストとか備忘録とか

クロージャ

なんかよくわからないものがあるんだけど、まあ関数そのものが変数に代入できて
それで動かすと中身がC言語でいうstatic変数みたいなんになってるんかなと。。
まあよくわからないけどそんなレベルで考えてる。

で、こんなコードを書いてみた。

package main
import "fmt"
func heke() func(int) int {
	z := 0
	return func(x int) int {
		z += x
		return z
	}
}

func main() {
	hekeheke := heke()
	for i:=0; i<5; i++ {
		fmt.Println(hekeheke(3))
	}
}

実行結果は

3
6
9
12
15

これは想定通り

じゃあ、heke()をmain()の中に直接書いたらどうなるんかなと思って

package main
import "fmt"
func main() {
	hekeheke := func() func(int) int {
		z := 0
		return func(x int) int {
			z += x
			return z
		}
	}
	for i:=0; i<5; i++ {
		fmt.Println(hekeheke(3))
	}	
}

とやってみた。
これは、コンパイルが通らないみたい。

.\hoge.go:12: too many arguments in call to hekeheke

と言われた。
で、12行目を

		fmt.Println(hekeheke()(3))

としてみた。これでコンパイルは通ったんだけど、実行結果は

3
3
3
3
3

うまくいかなかった。

さらに試行錯誤の結果、12行目はそのままにして、10行目(forの前の行)を

	}()

とかえてみた。うまくいった。

きっとこれらには意味があることなんだけど、今の僕にはまだよくわかっていない。
golangの関数はよくわからないことがいっぱいあるみたい。