g for range的一个坑

之前在逛博客时,看到了这个问题,在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 都对应同一个变量的地址,其值自然不会变

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值