Golang匿名函数和闭包区别_Golang闭包原理教程【必看】
匿名函数是无名函数,闭包是其捕获外层变量引用的能力;Go中所有闭包基于匿名函数,但仅当引用外层变量时才构成闭包,核心是捕获引用而非值。匿名函数就是没名字的函数,闭包是它“记住变量”的能力Go 里所有闭包都基于匿名函数,但不是所有匿名函数都是闭包。关键区别在于:是否引用了外层作用域的变量。只做计算、不碰外部变量的 func() { fmt.Println("hi") } 是匿名函数,但不是闭包;而 func() { fmt.Println(x) }(其中 x 是外层定义的变量)就构成了闭包——它把 x 的引用“打包”进去了。闭包的核心行为是「捕获变量的引用」,不是值——这点决定了几乎所有坑的根源匿名函数可以独立存在、立即执行、赋值给变量或传参;闭包则隐含了「环境绑定」,生命周期和作用域更复杂编译器会根据是否逃逸决定变量放栈还是堆:go build -gcflags="-m" 能看到 ... moved to heap 提示for 循环里起 goroutine 或 defer,闭包捕获的是同一个变量这是 Go 新手最常踩的坑:循环中直接用 i 启动 goroutine 或注册 defer,结果所有闭包最后都打印出循环结束后的 i 值(比如 5 或 len(slice))。原因很简单:闭包捕获的是 &i,不是 i 的副本。循环结束后 i 变成终值,所有闭包读到的都是这个终值。立即学习“go语言免费学习笔记(深入)”; Zeemo AI 一款专业的视频字幕制作和视频处理工具
