技术文摘
Go匿名函数闭包行为剖析:为何i变量总为4
2025-01-09 02:15:15 小编
Go匿名函数闭包行为剖析:为何i变量总为4
在Go语言编程中,匿名函数和闭包是非常强大且常用的特性,但有时候它们的行为可能会让人感到困惑。其中一个典型的问题就是在循环中使用匿名函数闭包时,发现变量i的值总是为4(这里以一个特定的循环示例来说明),接下来我们就深入剖析一下这种现象背后的原因。
我们来看一个简单的示例代码:
package main
import "fmt"
func main() {
var funcs []func()
for i := 0; i < 5; i++ {
funcs = append(funcs, func() {
fmt.Println(i)
})
}
for _, f := range funcs {
f()
}
}
运行这段代码,你会发现输出的结果都是4 。这是因为在Go中,匿名函数闭包捕获的是变量的引用,而不是变量的值。在上述循环中,匿名函数捕获的是变量i的引用,当循环结束时,i的值已经变为4 ,所以当我们调用这些匿名函数时,它们读取到的i的值都是4 。
要解决这个问题,我们可以通过在匿名函数内部创建一个新的局部变量来保存当前循环的i的值。修改后的代码如下:
package main
import "fmt"
func main() {
var funcs []func()
for i := 0; i < 5; i++ {
j := i
funcs = append(funcs, func() {
fmt.Println(j)
})
}
for _, f := range funcs {
f()
}
}
在这个修改后的版本中,我们在每次循环时都创建了一个新的局部变量j ,并将当前的i的值赋给它。这样,每个匿名函数闭包捕获的就是不同的j变量,从而得到了我们期望的结果。
理解Go语言中匿名函数闭包的这种行为对于编写正确、高效的代码至关重要。在实际编程中,当遇到类似的问题时,我们需要清楚闭包捕获变量的机制,通过合理的方式来避免出现意外的结果。通过对这种现象的深入剖析,我们能更好地掌握Go语言的特性,编写出更加健壮的程序。
- Ubuntu 优麒麟 20.10 终极预告现身 本周四将发布正式版
- 64 位 VMware 虚拟机系统无法打开的解决办法
- 鸿蒙智慧识屏的使用方法与教程
- Ubuntu 桌面环境 Gnome 配置 tweak tool 时 extension 插件选项不可见
- 数据中心缘何要运用配置管理系统?
- Debian11 添加桌面快捷图标的方法
- Debian11电脑锁屏快捷键及三种锁定屏幕方法
- 鸿蒙系统中隐藏应用图标及使用隐私空间的方法
- 鸿蒙查找设备功能的使用方法
- 虚拟机中 NAT 网络连接方式详解
- 鸿蒙流光快门设置方法
- Debian11 系统挂起的方法及详解
- Ubuntu 21.10 等旧版升级至 Ubuntu 22.04 LTS 的操作指南
- 如何隐藏 vmware10 虚拟机的菜单工具栏
- 在 conda 环境下于 ubuntu 20.04 的 jupyter 中添加和删除内核的办法