美文网首页golang
golang很容易踩的for range的坑

golang很容易踩的for range的坑

作者: 竹一先生_阳明学子 | 来源:发表于2019-12-18 22:05 被阅读0次

背景介绍

for range一个很容易踩的坑,记录一下。

现象描述

有问题的代码如下:

arr := []int{1, 2, 3}

myMap := make(map[int]*int)
for i, v := range arr {
    myMap[i] = &v
}

for _, v := range myMap {
    fmt.Println(*v)
}

上面这段代码执行结果是:

3
3
3

按理不是应该打印下面这个结果吗:

1
2
3

为什么结果不符合预期呢?

合理解释

上面的问题,就是for range有点坑的地方:

对于代码

for i, v := range arr

实际执行是:

  1. 声明变量i,v;
  2. 遍历arr,将第一个值1赋值给v,将v的地址myMap[0];
  3. 再将第二个值2赋值给v,将v的地址myMap[1];
  4. 再将第三个值3赋值给v,将v的地址myMap[2];

所以可以看到:
myMap[0]、myMap[1]、myMap[2]实际存储的都是同一个地址,
都是 遍历arr前声明好的变量v的地址,
所以打印出来的结果都是 最后放入v中的值3.

正确做法

知道了问题的本质原因后,解决方法也显而易见了:
将每次遍历的值赋值给新的变量,再将新变量的地址赋值给myMap[i];

代码

arr := []int{1, 2, 3}

myMap := make(map[int]*int)
for i, v := range arr {
    vTmp := v // 关键!!!
    myMap[i] = &vTmp
}

for _, v := range myMap {
    fmt.Println(*v)
}

喜欢的话,关注我的公众号哦

image.png

相关文章

  • golang很容易踩的for range的坑

    背景介绍 for range一个很容易踩的坑,记录一下。 现象描述 有问题的代码如下: 上面这段代码执行结果是: ...

  • windows server上 gorm 连接DB提示 the

    友情提示:window server上很容易就踩坑 1. 背景 语言:golang ORM: gorm 运行环境:...

  • golang for,range的坑

    for,range 的k,v变量在整个遍历过程中共用,不能直接进行引用传递,即地址传递,但循环内定义的变量只能为当...

  • [golang] for ... range指针的坑

    话不多说,看代码知道输出结果么? 输出结果 for range每次循环使用的是同一个临时变量!每次都是做了一次值拷...

  • Go 学习

    go语言局部变量分配在栈还是堆Golang 垃圾回收剖析go语言坑之for range

  • 一文区分call,bind,apply

    前言 我们都知道这三种方法都用于绑定this,但没有区分好,很容易踩坑。继多次踩坑之后我又踩坑了,所以决定再次学习...

  • golang 踩过的坑

    1.闭包导致循环时取到的数据不正确2.冒号形式初始化覆盖全局变量3.污染了全局变量,导致不同请求间相互有影响4.新...

  • golang 新手容易遇到的坑

    Golang Range关键字的秘密

  • Golang range 的一些坑

    先举个栗子: 我们期望的结果是 但是实际输出的结果是 为什么没有改变? 其实 for range 中的 v 是一个...

  • Golang中range指针数据的坑

    在Golang中使用for range语句进行迭代非常的便捷,但在涉及到指针时就得小心一点了。 下面的代码中定义了...

网友评论

    本文标题:golang很容易踩的for range的坑

    本文链接:https://www.haomeiwen.com/subject/hlrpnctx.html