大气企业网站欣赏/专业恶意点击软件
之前在逛博客时,看到了这个问题,在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 intfor 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 都对应同一个变量的地址,其值自然不会变