变量的作用域,通常有包package范围、函数func范围、或者闭包closure范围, go语言毕竟比C语言复杂一点点,有些变量作用域很容易理解,有些就比较特殊。
例如下面的例子,输出结果到底是什么呢?有点令人疑惑,和go语言的设计理念有一点点冲突。
package main
import "fmt"
func wrapper() func() int {
x := 0
return func() int {
x++
return x
}
}
func main() {
increment := wrapper()
fmt.Println(increment())
fmt.Println(increment())
}
这个例子的输出结果是:
1
2
该如何理解呢?为什么不是两个1?
这个其实就是闭包的特殊性,普通函数会每次初始化变量,而闭包会全局执行一次初始化之后维持变量。
网友评论