GO是函数式编程,不是面像对象的语言,它没有对象的概念,一切都是根据结构体去分配内存,GO中的函数也是如此。
先上一段代码:
package main
import "fmt"
func adder1() func(i int) int {
sum := 0
return func(v int) int {
sum += v
return sum
}
}
func main() {
//a := adder1()表达式应该是得到下面这个函数
//return func(v int) int {
// sum += v
// return sum
//}
a := adder1()
//每次往a函数中传入参数都会得到自加
//sum := 0 -> sum是个函数闭包内的自由变量
for i := 0;i<10 ;i++ {
fmt.Println(a(i))
}
}
代码中已经加了比较详细的注释,当a=adder1()时编译器会返回一个函数的闭包。
函数体部分是:
return func(v int) int {
sum += v
return sum
}
sum是函数体的自由变量,这个变量也可以是结构体,如果是结构体的话还可能会引用到外部的变量,会形成一棵引用树,最终都会被包括到函数的闭包中。
篇外话,正统的函数式编程是不可以有状态和变量了,当然就GO来说对此无要求。
按