g for range的一个坑
Posted 安然_随心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了g for range的一个坑相关的知识,希望对你有一定的参考价值。
之前在逛博客时,看到了这个问题,在for range 时,取切片的一个问题,开始没有仔细想,后来有同时在这里出了一个bug,这才搜了一下这个问题。
可看下面的test:
func TestArray(t *testing.T)
slice2 := []int0, 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 := []int0, 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 都对应同一个变量的地址,其值自然不会变
以上是关于g for range的一个坑的主要内容,如果未能解决你的问题,请参考以下文章
一个奇怪的问题:Last_Errno: 1264 Error 'Out of range value for column 0x322E36343030