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 一款专业的视频字幕制作和视频处理工具