最近看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函数可见