为何Go语言闭包示例输出12而非11?
为什么这段Go代码输出12而不是11?
先看你贴的代码:
func fA() func() int { i := 0 return func() int { i++ return i } } func main() { fB := fA() fmt.Print(fB()) fmt.Print(fB()) }
问题出在闭包的变量捕获机制上:
- 调用
fA()时,会创建变量i并初始化为0,然后返回一个匿名函数(也就是闭包)。这个闭包不会复制i的值,而是直接和i的内存地址绑定,共享同一个变量。 - 第一次调用
fB():闭包里的i自增(从0变成1),返回1,fmt.Print输出1。 - 第二次调用
fB():闭包还是用同一个i,再次自增(从1变成2),返回2,fmt.Print输出2。
两次输出连在一起就是12,而不是你预期的11——因为两次调用用的是同一个i,不是每次调用都重新初始化i。
内容的提问来源于stack exchange,提问作者Zoya
相关产品推荐
相关产品推荐

