golang for range的坑

参考

核心点

for range的时候index和value每次都是同一个空间,然后把相应的数据拷进来,所以如果取地址的话用于都是同一个地址

code

func TestForRange(t *testing.T) {
	slice := []int{0, 1, 2, 3}
	myMap := make(map[int]*int)

	for index, value := range slice {
		fmt.Println("oriSliceValue", &slice[index])
		fmt.Println("forRangeValue", &value)
		myMap[index] = &value
	}
	fmt.Println(myMap)
}

输出

oriSliceValue 0xc000016220
forRangeValue 0xc00001c2e8
oriSliceValue 0xc000016228
forRangeValue 0xc00001c2e8
oriSliceValue 0xc000016230
forRangeValue 0xc00001c2e8
oriSliceValue 0xc000016238
forRangeValue 0xc00001c2e8
map[0:0xc00001c2e8 1:0xc00001c2e8 2:0xc00001c2e8 3:0xc00001c2e8]

可以看到最后的map每个地址都是一样的,都是for range里面临时创建的一个空间,最后逃逸出来了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值