[golang工作日记] for range 踩坑

news2025/1/8 5:35:16

1、for range指针赋值

Ops的数据保存在两个表中,一个是ops_tab,另一个是staff_tab,其中ops_tab的staff_id是staff_tab的外键,两个表都有staff_id字段。

type OpsDetail struct {
	OpsId   string
	StaffId string
	Ops     *model.OpsTab
	Staff   *model.StaffTab
}

现要写一个方法将两个表关联起来,保存到上面那个结构体

opsId2OpsDetailMap := make(map[string]*OpsDetail)

for _, ops := range opsList {
	opsId2OpsDetailMap[ops.OpsId] = &OpsDetail{
		OpsId:   ops.OpsId,
		Ops:     &ops,
		StaffId: ops.StaffId,
		Staff:   nil,
	}
	staffIdSet.Add(ops.StaffId)
}
staffId2StaffMap := make(map[string]*model.StaffTab)
for _, staff := range staffList {
	staffId2StaffMap[staff.StaffId] = &staff
}

这两段代码有看出来什么问题吗?


在这里插入图片描述
问题出在图中那两个框里,每一次循环后面的ops就会覆盖这个值,最后OpsDetail所有的Ops指针指向最后一个Ops。

期望:
在这里插入图片描述

现实:
在这里插入图片描述
如何修改

	for idx := range opsList {
		ops := opsList[idx]//设置临时变量
		opsId2OpsDetailMap[ops.OpsId] = &OpsDetail{
			OpsId:   ops.OpsId,
			Ops:     &ops,
			StaffId: ops.StaffId,
			Staff:   nil,
		}
	}

2、for range闭包

这个类似第一个

	s := []string{"1", "2", "3"}
 
    for _, v := range s {
        go func() {
            println(v)
        }()
    }

结果:
3
3
3

分析:
for循环执行速度很快,携程都还没跑起来就已经循环结束了,指针指向最后一个元素

3、for range非指针赋值


    s := []Info{
        Info{
            Name: "test",
        },
    }
 
    for _, v := range s {
        v.Name = "new"
    }
    fmt.Println(s[0].Name)

结果:test
分析:
在for多次循环中,value是值赋值的方式。因此上面的for _, v := range s 过程中,其实是针对于每个Info的结构体,赋值了一份给了变量v。 因此,修改v的Name属性,并不会影响原有切片中的元素的值得。
如何解决:

	for i := range s {
	   s[i].Name = "newvalue"
	}

4、for循环遍历更新slice不会改变运行次数

    s := []int{1, 2}
    for i := range s {
        fmt.Println(i)
        s = append(s, i)
    }
    fmt.Println(s)

输出:
1
2
[1 2 0 1]

最好不要一边遍历一边修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Node.js安装配置

目录1. 下载node2. 安装3. 检查是否安装成功4. 配置缓存路径5. 实现一个demo1. 下载node 官方地址https://nodejs.org/en/下载长期支持版本 2. 安装 一路next node一起安装npm 这个地方不要勾选 安装成功 3. 检查是否安装成功 cmd运行下面命令 # 查看node的版本 node -v # …

【博客571】“时序敏感应用“ 如何prometheus自定义上报时间戳

“时序敏感应用” 如何prometheus自定义上报时间戳 1、场景 在物理网络监控中,对于流量趋势是极其敏感的,物理网络监控流量的点通常是秒级别甚至毫秒级别,此时这些时许点通过各种上报上传到监控系统中,由于网络波动,可…

Kubernetes v1.24.2高可用部署

sskubeasz 1、Kubeasy简介 kubeasz 致力于提供快速部署高可用k8s集群的工具, 同时也努力成为k8s实践、使用的参考书;基于二进制方式部署和利用ansible-playbook实现自动化;既提供一键安装脚本, 也可以根据安装指南分步执行安装各个组件。 kubeasz 从每…

【lc刷题 day12】堆/栈/队列

BM42 用两个栈实现队列 easy import java.util.Stack;public class Solution {Stack<Integer> stack1 new Stack<Integer>();Stack<Integer> stack2 new Stack<Integer>();public void push(int node) {stack1.push(node);}public int pop() {if(st…

随便聊聊浪潮开务数据库

今天这个话题挺随意&#xff0c;我们来聊聊浪潮开务数据库&#xff0c;原因主要是我的微信朋友圈被这个数据库刷屏了。当然我对这款号称多模数据库的非开源数据库也很感兴趣&#xff0c;也有很多疑问&#xff0c;希望各位专家能帮忙答疑解惑&#xff0c;揭开这款即将发布的 Kai…

机器学习--多层感知机、卷积神经网络、循环神经网络

目录 一、多层感知机 二、卷积神经网络 三、循环神经网络 总结 一、多层感知机 手工提取特征&#xff08;用人的知识进行&#xff09; --> 神经网络来提取特征。 神经网络&#xff08;可能更懂机器学习&#xff09;来提取 可能对后面的线性或softmax回归可能会更好一…

【UE4 第一人称射击游戏】23-添加子弹伤害

上一篇&#xff1a;https://blog.csdn.net/ChaoChao66666/article/details/128589063?spm1001.2014.3001.5501本篇效果&#xff1a;步骤&#xff1a;创建一个蓝图类&#xff08;父类为Character&#xff09;&#xff0c;命名为“SimpleAI”双击打开“SimpleAI”&#xff0c;点…

非对称加密实战(一):JDK生成keystore获取公钥私钥及代码验证【附源码】

目录使用说明非对称加密生成keystore文件公钥私钥互相解密获取fd-alias.keystore中的公钥私钥使用生成公钥私钥进行解密源码地址使用说明 非对称加密 非对称加密算法主要有&#xff1a;RSA、Elgamal、背包算法、Rabin、D-H、ECC&#xff08;椭圆曲线加密算法&#xff09;。下…

TensorRT学习笔记--基于FCN-ResNet101推理引擎实现语义分割

目录 前言 1--Pytorch模型转换为Onnx模型 2--Onnx模型可视化及测试 2-1--可视化Onnx模型 2-2--测试Onnx模型 3--Onnx模型转换为Tensor RT推理模型 4--基于Tensor RT使用推理引擎实现语义分割 前言 基于Tensor RT的模型转换流程&#xff1a;Pytorch → Onnx → Tensor RT…

通用vue组件化首页

一、首先先建立文件main.vue,构建主体 1.选择合适的模板element-plus,直接复制 2.编写相应的样式 <template><div class"main"><el-container class"main-content"><el-aside> aside </el-aside><el-container class&q…

2022年中职组网络安全竞赛D模块竞赛漏洞报告单总结

Windows加固 后门用户 漏洞发现过程 打开cmd使用net user 看到”hacker”用户,疑似存在后门用户 使用hacker/123456成功登录目标服务器,证明存在后门用户 漏洞加固过程 删除后门用户

HTML与CSS基础(一)—— HTML基础(web标准、开发工具、标签)

目标能够理解HTML的 基本语法 和标签的关系 能够使用 排版标签 实现网页中标题、段落等效果 能够使用 相对路径 选择不同目录下的文件 能够使用 媒体标签 在网页中显示图片、播放音频和视频 能够使用 链接标签 实现页面跳转功能一、基础认知目标&#xff1a;认识 网页组成 和 五…

【Linux】程序的翻译四个阶段(图示详解)

因为淋过雨&#xff0c;所以懂的为别人撑伞&#xff1b;因为迷茫过&#xff0c;所以懂得为别人指路。 我们都知道写好代码后&#xff0c;编译器会帮助我们把代码生成可执行程序&#xff0c;细加了解又会知道程序的生成又分为四步&#xff1a;预处理、编译、汇编、链接。那么这四…

JAVA语言基础语法——异常中的常见方法及抛出异常等练习

Throwable的成员方法定义在最顶级Throwable类中a.实例如下&#xff1a;e.printStackTrace(); 将异常的所有信息红色的字体打印在控制台&#xff0c;不会结束虚拟机&#xff0c;仅仅只是打印的操作。抛出处理throws注意&#xff1a;写在方法定义处&#xff0c;表示声明一个异常&…

DOM(三):鼠标、键盘事件对象

鼠标、键盘事件对象鼠标事件对象键盘事件对象鼠标事件对象 event对象代表事件的状态&#xff0c;和事件相关的一系列信息的集合。现阶段我们主要是用鼠标事件对象MouseEvent和键盘事件对象KeyboardEvent 例如&#xff1a; // 鼠标事件对象 MouseEventdocument.addEventListene…

Android正确的保活方案,不要掉进保活需求死循环陷进

在开始前&#xff0c;还是给大家简单介绍一下&#xff0c;以前出现过的一些黑科技&#xff1a; 大概在6年前Github中出现过一个叫MarsDaemon&#xff0c;这个库通过双进程守护的方式实现保活&#xff0c;一时间风头无两。好景不长&#xff0c;进入 Android 8.0时代之后&#x…

STM32系列单片机标准库移植FreeRTOS V10.4.6详解

文中所用到的资料下载地址 https://download.csdn.net/download/qq_20222919/87370679 最近看正点原子新录制了手把手教你学FreeRTOS的视频教程&#xff0c;看了一下教程发现视频里面讲的是使用HAL移植 FreeRTOS V10.4.6 版本&#xff0c;以前的标准库移植的是FreeRTOS V9.0 版…

关于PostgreSQL JIT Memory-Leak 问题 从 LLVM源码层面来分析

文章目录前言LLVM Types 在 JIT中的使用LLVM Types 设计导致的 PG JIT 内存问题分析解决&#xff1f;前言 之前介绍 PG 的 JIT 实现 时提到 为了性能开启JIT 之后有一个比较严重的内存泄漏问题。现象就是在一个backend 内持续跑大量的 sqllogic 随机复杂查询&#xff0c;能够看…

java 微服务 Nacos配置 feign 网关路由

Nacos配置管理 配置信息我们写有热更新需求的配置就可以了 1.引入Nacos的配置管理客户端依赖&#xff1a; <!--nacos配置管理依赖--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config…

HBase基础_1

HBase 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kafka Hbase Hive…