最近看go语言,发现一个有意思的语法,原文是描述匿名函数的,不过从这里面发现一个有意思的东西,即我们可以返回一个函数,并且可以不断调用此函数。由于之前已经完成了外层函数的调用,实际上相当于外层函数保存我们所需的数据。
源代码如下:
package test
import (
"testing"
)
func squares() func() int {
var x int
return func() int {
x++
return x * x
}
}
func TestFunc(t *testing.T) {
f := squares()
t.Log(f())
t.Log(f())
t.Log(f())
}
运行结果如下:
=== RUN TestFunc
func_test.go:16: 1
func_test.go:17: 4
func_test.go:18: 9
--- PASS: TestFunc (0.00s)
PASS
可以看到调用
f := squares()时相当于设置了一个全局变量x, 每次调用f()实际上调用的是后面的匿名函数,直接修改了变量x,就如同我们在其它语言中设定了一个全局变量后,调用一个函数不断改变全局变量的值,但在这里这个全局变量只针对squares函数可见