golang for range的问题

看别人博客总是能看到各种吐槽for range的 缺陷(flaw)

nameArr := []string{ "a", "b", "c"}
type call func()
var test []call
for index, name := range nameArr{
    test = append(test, func() {
    fmt.Println(name, index)
})
}
test[0]() // c 2
test[1]() // c 2
test[2]() // c 2

上面的代码主要是range 中 name 是指的拷贝,每次循环都要拷贝一遍.

这是go 的经典问题,循环的时候传指针

修改如下

nameArr := []string{ "a", "b", "c"}
type call func()
var test []call
for index, name := range nameArr{
    name := name
    index := index
    test = append(test, func() {
    fmt.Println(name, index)
})
}
test[0]() // a 0
test[1]() // b 1
test[2]() // c 2