Go踩坑记录
先pos测试代码
var all []*int
items := []int{1, 2, 3, 4, 5, 6}
for _, item := range items {
all = append(all, &item)
println(item)
println(&item)
}
结果:
1
0xc000018050
2
0xc000018050
3
0xc000018050
结论:
for循环不会每次重新定义item,不要被 := 迷惑,只能说有点反直觉
闭包函数
var prints []func()
for _, v := range []int{1, 2, 3} {
prints = append(prints, func() { fmt.Println(v) })
}
for _, p := range prints {
p()
}
结果
3
3
3
结论:
for 循环结束后,最后 v 的值被设置为了 3
解决方法:
都在里面重新赋值,对v重新声明
for _, item := range items {
item := item
all = append(all, &item)
println(item)
println(&item)
}
for _, v := range []int{1, 2, 3} {
v := v
prints = append(prints, func() { fmt.Println(v) })
}