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

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

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

func beforeRefactor() {
    var configListExpr = fetchConfigListExpr()
    
    newConfigListExpr := replaceConfigVariables(configListExpr)

    var configList []Config
    if 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.URLList
        newURLList = replaceURLListVariables(urlList)
        config.URLList = newURLList
    }

    return configList
}

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

相关推荐

  1. 日常Golang一个slice数据替换bug排查

    2024-07-21 05:38:02       22 阅读
  2. Golang对nilSlice和空Slice处理是一致

    2024-07-21 05:38:02       26 阅读
  3. golang数组array和切片slice区别

    2024-07-21 05:38:02       29 阅读
  4. 日常】慢查询风险治理思路

    2024-07-21 05:38:02       61 阅读
  5. 解决splice改变原数组BUG

    2024-07-21 05:38:02       22 阅读
  6. 解决splice改变原数组BUG

    2024-07-21 05:38:02       24 阅读
  7. 容易记混方法slicesplice、split

    2024-07-21 05:38:02       33 阅读
  8. splice()、slice()、split()三种方法区别

    2024-07-21 05:38:02       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 05:38:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 05:38:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 05:38:02       45 阅读
  4. Python语言-面向对象

    2024-07-21 05:38:02       55 阅读

热门阅读

  1. Fabric:Fabric-Gateway-Go的使用方法

    2024-07-21 05:38:02       16 阅读
  2. 机器学习 - 信息增益

    2024-07-21 05:38:02       20 阅读
  3. lua 写一个 不同时区之间转换日期和时间 函数

    2024-07-21 05:38:02       19 阅读
  4. 探索Perl的文件系统插件:灵活的系统扩展

    2024-07-21 05:38:02       18 阅读
  5. Spring Boot中的404错误:原因、影响及处理策略

    2024-07-21 05:38:02       21 阅读
  6. Perl并发编程秘籍:线程间通信的艺术

    2024-07-21 05:38:02       16 阅读
  7. PyTorch LSTM 单步、多步时间预测

    2024-07-21 05:38:02       18 阅读
  8. Android 14 适配之— BluetoothAdapter、JobScheduler、 Tiles

    2024-07-21 05:38:02       20 阅读
  9. 厦门大学学报哲学社会科学版

    2024-07-21 05:38:02       16 阅读
  10. 【机器学习】FlyFlowerSong【人工智能】资源指南

    2024-07-21 05:38:02       17 阅读