例子如下
package main
import "fmt"
func test(base int) (func(int) int, func(int) int) {
add := func(i int) int {
base += i
return base
}
sub := func(i int) int {
base -= i
return base
}
return add, sub
}
func main() {
f1, f2 := test(10)
fmt.Println(f1(1), f2(2))//输出 11 9
}
一个test函数,返回值为2个func(int)int。从输出结果得知由于闭包的存在base在f1返回后其值仍然保留,即其生命周期不由作用域范围决定。
将主函数稍作修改
func main() {
f1, _ := test(10)
_, f2 := test(10)
fmt.Println(f1(1), f2(2))//输出 11 8
}
此时f2的输出为8。这是因为f1与f2是在两次调用中分别赋值的,f2中的base值肯定不会受到其他调用的影响。
再将代码稍作修改
package main
import "fmt"
func test() (func(int) int, func(int) int) {
base := 10
add := func(i int) int {
base += i
return base
}
base = 10//调用f1,f2时不再执行
sub := func(i int) int {
base -= i
return base
}
return add, sub
}
func main() {
f1, f2 := test()
fmt.Println(f1(1), f2(2)) //输出 11 9
}
将base的值改为由test()函数内部定义,此时f2的输出为9。说明了 “base=10” 这个语句仅仅在调用test()语句时执行。当执行f1,f2时指针已经分别位于两个不同的闭包函数,在f2执行前base仍等于11。