闭包其实是匿名函数,不过与一般匿名函数不同,它要引用外部变量。
package main
import "fmt"func getSum() func(int)(int){var sum int = 0return func(x int) int{sum += xreturn 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 := 0sum = preSum + xreturn sum
}
func main(){fmt.Println(getSum(0,1))fmt.Println(getSum(getSum(0,1),2))}
可以看到函数需要两个参数,而闭包只需要一个。显然不用闭包就比较麻烦了。