golang 中的函数作为一等公民,所以函数作为函数的返回值非常常见。
第一题
func Test1(t *testing.T) {
adder := func() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
add, sub := adder(), adder()
for i := 0; i < 4; i++ {
fmt.Println(add(i), sub(-i))
}
}
add 和 sub 分别持有一个 sum 的闭包,所以结果显然易见
0 0
1 -1
3 -3
6 -6
第二题
func Test2(t *testing.T) {
sum := 0
adder := func() func(int) int {
return func(x int) int {
sum += x
return sum
}
}
add, sub := adder(), adder()
for i := 0; i < 4; i++ {
fmt.Println(add(i), sub(-i))
}
}
把 sum 抽取到函数外,这样 add 和 sub 都持有了 sum 的引用,所以计算结果既在意料之外,又在情理之中。
0 0
1 0
2 0
3 0
小结
分析闭包,需要跳出函数具体实现,看整体的一个逻辑。
有疑问加站长微信联系(非本文作者)