golang for range指针操作取到同一个值(填坑)

golang for range指针操作取到同一个值(填坑)

最近写了一个批量查询,结果转成Map[id]bean的方法,上线后有问题,发现每次所有的k都指向同一个value,最后背上一个基础不牢的骂名😭

我来还原一下案发现场

image-20230404103843095

其实问题很简单

  • for range循环其实这是普通for循环的语法糖,在for循环里面,b这个指针其实只创建了一次,之后每一次遍历其实都只是将这个指针指向新的地址
  • 最后遍历的时候由于我们存的都是同一个指针,取到的当然也是同一个值

解决方式:

  • 设置中间值,用来保存每次遍历出来的值

    // 组装成map返回 k:userId v:v
    m := make(map[uint]*entity.Bottom)
    for _, b := range bottoms {
      // 中间变量指向对应的地址空间,并且每次都会重新创建一次,不会产生干扰
      tmp := b
      m[b.Id] = &tmp
    }
    
  • 直接取值

    // 不存放指针了,直接存值
    m := make(map[uint]entity.Bottom)
    for _, b := range bottoms {
      m[b.Id] = b
    }
    for k, v := range m {
      fmt.Println("k:", k, "v:", v)
    }
    

image-20230404103926973

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值