go函数闭包
假如说有一个需求就是每次访问一个函数之后都会获得一个变量递增之后的值,并且可以随时将这个变量的值清零。
如果想要做到前半部分的需求,我们可以使用全局变量。例如
var idx int
func getidx() int {
idx += 1
return idx
}
func main() {
for range 5 {
fmt.Println(getidx())
}
}
之后想要完成第二个需求也可以通过将idx赋值为0来实现。
除了全局变量之外,还可以使用go函数闭包的特性来实现。例如:
func getidx() func() int {
idx := 0
return func() int {
idx += 1
return idx
}
}
func main() {
id := getidx()
for range 5 {
fmt.Println(id())
}
}
此时假如想要将值清零可以重新调用getidx,获取一个新的函数的句柄,然后调用新获取的函数的句柄。例如:
func main() {
// ... 省略上面内容
id2 := getidx()
for range 3 {
fmt.Println(id2())
}
}
运行之后的结果应该如下所示:
1
2
3
4
5
1
2
3
通过上面的例子可以看出和使用全局变量的方式相比,函数闭包的实现可以不依赖于一个专门的变量,这对于后面有多个线程同时需要使用到idx时可以避免发生堵塞和竞争。