当前位置: 首页 > news >正文

【极客日常】Golang一个的slice数据替换的bug排查

上周某天下班前,接到同事转来一个bug要排查,症状是代码重构之后某些业务效果不符合预期,由于代码重构人是笔者,于是blame到笔者这边。经过10min左右的排查和尝试后,解决了这个问题:既往逻辑没有改动,重构时候出笔误了。

简单来讲,重构之前的代码大概是这个样子:

func beforeRefactor() {var configListExpr = fetchConfigListExpr()newConfigListExpr := replaceConfigVariables(configListExpr)var configList []Configif err := json.Unmarshal([]byte(newConfigListExpr), &configList); err != nil {panic("unmarshal configList err: " + err.Error())}return configList
}

而改造业务逻辑时,因为类似于replaceVariables这类对configList批量处理的流程更多,所以定义了很多函数节点去对configList做批量的替换以及内部属性的修改。因此重构时候,就把replaceConfigVariables做了更细粒度的转换,然后同时把整个configList替换逻辑也顺带修改了下。大概改成了这样:

func afterRefactor() {var configList []Config = fetchConfigList()for _, config := range configList {urlList := config.URLListnewURLList = replaceURLListVariables(urlList)config.URLList = newURLList}return configList
}

这段代码是存在问题的。由于这次重构提的代码很多,cr时候没有发现;然后一开始排查以为是重构引起的业务逻辑变更,所以忽略了Golang本身机制导致的问题。这里的问题是,遍历slice的时候,要想改动原来slice里成员的属性,不应该用config这个复制品,而得用configList取下标这种方式来取到原始的成员实例,或者干脆把configList整个全新替换,这样才可以达到效果。

http://www.lryc.cn/news/404345.html

相关文章:

  • HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号3
  • UE4-光照重建
  • 【2024德国签证】留学面签问题汇总
  • 知识点大纲
  • MySQL:库表操作
  • 8.3 End-to-end Data Protection (Optional)
  • python实现图像对比度增强算法
  • 【D3.js in Action 3 精译_020】2.6 用 D3 设置与修改元素样式 + 名人专访(Nadieh Bremer)+ 2.7 本章小结
  • GIT命令学习 二
  • LeetCode 150, 112, 130
  • c++应用网络编程之五Windows常用的网络IO模型
  • PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动?
  • 鑫创SSS1700USB音频桥芯片USB转IIS芯片
  • 计算机视觉发展历程
  • 从安装Node到TypeScript到VsCode的配置教程
  • Jackson详解
  • 【算法】字符串
  • Python酷库之旅-第三方库Pandas(037)
  • iOS 左滑返回事件的控制
  • = null 和 is null;SQL中关于NULL处理的4个陷阱;三值逻辑
  • 拖拽上传(预览图片)
  • Oracle 12c新特性 In-Memory Column Store
  • 【数据结构】二叉树———Lesson2
  • mongodb数据导出与导入
  • 电路学习——经典运放电路之滞回比较器(施密特触发器)(2024.07.18)
  • NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker)
  • JavaWeb day01-HTML入门
  • 驱动框架——CMSIS第一部分 RTE驱动框架介绍
  • Debezium日常分享系列之:Debezium2.7版本PostgreSQL数据库连接器
  • 保障信息系统安全保护等级调整期间的安全性