之前在逛博客时,看到了这个问题,在for range 时,取切片的一个问题,开始没有仔细想,后来有同时在这里出了一个bug,这才搜了一下这个问题。
可看下面的test:
func TestArray(t *testing.T) {
slice2 := []int{0, 1, 2, 3}
myMap := make(map[int]*int)
for index, value := range slice2 {
logrus.Errorf("index %v value %v,prt %v", index, value, &value)
myMap[index] = &value
}
for key, val := range myMap {
logrus.Errorf("myMap key:%v,value:%v", key, *val)
}
}
输出如下所示:
ERRO[0004] index 0 value 0,prt 0xc000eee978
ERRO[0004] index 1 value 1,prt 0xc000eee978
ERRO[0004] index 2 value 2,prt 0xc000eee978
ERRO[0004] index 3 value 3,prt 0xc000eee978
ERRO[0004] myMap key:0,value:3
ERRO[0004] myMap key:1,value:3
ERRO[0004] myMap key:2,value:3
ERRO[0004] myMap key:3,value:3
google 了一下相关的文章,觉得里面的解释不是很清楚,后来仔细想了一下,发现这个现象还是比较好理解的。
对于for range 可以进行如下变形:
func TestArray(t *testing.T) {
slice2 := []int{0, 1, 2, 3}
myMap := make(map[int]*int)
var index, value int
for index, value = range slice2 {
logrus.Errorf("index %v value %v,prt %v", index, value, &value)
myMap[index] = &value
}
for key, val := range myMap {
logrus.Errorf("myMap key:%v,value:%v", key, *val)
}
}
index,value 都只有一个地址,在range 的过程中,将 切片的值不停的赋值给 value上。在range的过程中,myMap 中的key 都对应同一个变量的地址,其值自然不会变