问题描述
在开发过程中发现在循环中引用捕获了变量,导致最后输出结果都是同一个值。
arr := []int{1, 2, 3, 4, 5}
for i, v := range arr {
go func() { fmt.Println(v) }()
}
// 输出结果: 5 5 5 5 5
搜索后发现这个坑可以说是新手必踩,所以记录一下。
* bug 产生原因:在 Golang 的循环中,由于 func 或者指针的引用,并且这个引用逃逸出了当前循环的生命周期范围。而在 Golang 中,循环变量的生命周期为整个循环,而不是每个迭代都会创建一个新的变量,所以导致每个迭代的引用实际上都指向同一个值。
更多关于Golang中逃逸现象可以看一下这篇文章 github
解决方案
* 使用临时变量来接收循环变量的值,避免引用逃逸。
arr := []int{