You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:22:06