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的一个坑的主要内容,如果未能解决你的问题,请参考以下文章

学习-go语言坑之for range

go语言---for range

Go36-18-for和switch

ranged for 变量循环导致返回局部变量的地址引用?

一个奇怪的问题:Last_Errno: 1264 Error 'Out of range value for column 0x322E36343030

IDEA_MyBatis_SQLException:Parameter index out of range坑