在开发过程中发现在循环中引用捕获了变量,导致最后输出结果都是同一个值。
arr := []int{1, 2, 3, 4, 5}
for i, v := range arr {
go func() { fmt.Println(v) }()
}
// 输出结果: 5 5 5 5 5
搜索后发现这个坑可以说是新手必踩,所以记录一下。
更多关于Golang中逃逸现象可以看一下这篇文章 github
arr := []int{1, 2, 3, 4, 5}
for _, v := range arr {
temp := v //
go func() { fmt.Println(temp) }()
}
// 输出结果:1 2 3 4 5
这个问题本质是 Golang 设计时就决定将循环变量设置成 per loop。在这个 issue 中提到了这个问题,并在 1.21 版本中将 for 语义从 Pre-loop 修改成 Pre-iteration。