Go闭包中myinc := inc()与inc()()的差异困惑及原理咨询
Go闭包调用逻辑差异解析
先看你的第一段代码:
func inc() func() int { var i int = 0 return func() int { i++ return i } } func main() { myinc := inc() fmt.Println(myinc()) fmt.Println(myinc()) fmt.Println(myinc()) }
这里myinc := inc()只执行了一次inc()函数:
- 调用
inc()时,会创建局部变量i并初始化为0,然后返回一个闭包函数,这个闭包会捕获并持有这个i的引用。 - 后续每次调用
myinc(),都是对同一个i进行自增操作,所以输出依次是1、2、3。
再看第二段代码:
func main() { fmt.Println(inc()()) fmt.Println(inc()()) fmt.Println(inc()()) }
这里每次inc()()都是完整执行了一次inc()+调用返回的闭包:
- 每调用一次
inc(),都会重新创建一个全新的局部变量i(初始值0),然后返回绑定这个新i的闭包。 - 调用闭包时,这个新
i自增为1并返回,之后这个i就随着inc()函数执行结束被销毁了。 - 下一次
inc()()又会重复这个过程:新的i、新的闭包、自增到1返回,所以三次输出都是1。
简单说,myinc := inc()是复用同一个闭包和它绑定的变量,而inc()()是每次都创建新的闭包和新的绑定变量,这就是两者执行逻辑的核心差异。
内容的提问来源于stack exchange,提问作者johca
相关产品推荐
相关产品推荐

