A Tour of Go でクロージャーが出てきたのでまとめてみた。
sample.go
package main
import "fmt"
//クロージャー
func adder() func() int {
sum := 0
return func() int {
sum += 1
return sum
}
}
func main() {
a := adder()
for i := 0; i < 10; i++ {
fmt.Println(a())
}
}
出力結果は以下の通り
0
1
2
3
4
5
6
7
8
9
10
当時の自分: a()を10回実行しているのは理解できる。あれ...a()に代入しているadder()は
closure.go
//クロージャー
func adder() func() int {
sum := 0
return func() int {
sum += 1
return sum
}
}
これだから、毎回 sum := 0
で初期化されるのでは???
いや違う!
a := adder()
では、関数adderを実行し、その戻り値がaに代入されている。
つまりaの中身は以下である。
a.go
func() int {
sum += 1
return sum
}
なるほど! 最初の代入の段階でsum := 0
が実行されていて、その後は戻り値の関数のみが実行されているということか。
終わり