闭包其实是匿名函数,不过与一般匿名函数不同,它要引用外部变量。
package main
import "fmt"
func getSum() func(int)(int){
var sum int = 0
return func(x int) int{
sum += x
return sum
}
}
func main(){
f := getSum()
fmt.Println(f(1))
fmt.Println(f(2))
}
引用的外部变量是sum,每执行一次,sum的初始值并不是0,它会不断变化。所以要实现闭包,必须在匿名函数内不断修改sum的值。
不用闭包的版本
package main
import "fmt"
func getSum(preSum int,x int) int {
sum := 0
sum = preSum + x
return sum
}
func main(){
fmt.Println(getSum(0,1))
fmt.Println(getSum(getSum(0,1),2))
}
可以看到函数需要两个参数,而闭包只需要一个。显然不用闭包就比较麻烦了。