クロージャ
なんかよくわからないものがあるんだけど、まあ関数そのものが変数に代入できて
それで動かすと中身が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の関数はよくわからないことがいっぱいあるみたい。