You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何精简带错误校验的重复Go代码 同时满足错误向上传递需求

Go重复时间解析逻辑优化方案

你担心封装后无法传递错误的顾虑完全可以避免,这里提供两种常用的优雅优化方案:

方案1:使用带错误缓存的闭包(适合字段数量较少的场景)

func parseData(rows []Row) ([]db.StandardImportUpsertStandardParams, error) {
    const timeLayout = "02/01/2006"
    for _, row := range rows {
        var err error
        // 定义闭包缓存错误,一旦出错后续调用直接返回零值
        parseRowTime := func(fieldKey string) time.Time {
            if err != nil {
                return time.Time{}
            }
            var t time.Time
            t, err = parseTime(timeLayout, row[fieldKey])
            return t
        }

        startDate := parseRowTime("Date of start of presumption of conformity (1)")
        restrictionStartDate := parseRowTime("Date of start of presumption of conformity with restriction (4)")
        withdrawalDate := parseRowTime("Date of withdrawal from OJ (end of presumption of conformity) (6)")
        // 只需要统一判断一次错误
        if err != nil {
            return nil, err
        }
        // 后续业务逻辑...
    }
    // 后续返回逻辑...
}

优势:

  • 所有重复的解析、错误判断逻辑收敛到闭包内部,业务侧只需传入字段名即可拿到解析结果
  • 错误会被闭包自动缓存,只需在所有解析操作完成后统一判断一次,即可正常向上返回错误
  • 时间布局抽为常量统一管理,后续修改仅需调整一处

方案2:使用配置映射批量解析(适合字段数量多、后续可能新增解析字段的场景)

func parseData(rows []Row) ([]db.StandardImportUpsertStandardParams, error) {
    const timeLayout = "02/01/2006"
    for _, row := range rows {
        var (
            startDate             time.Time
            restrictionStartDate  time.Time
            withdrawalDate        time.Time
        )
        // 提前定义字段和目标变量的映射关系
        timeFields := []struct {
            key    string
            target *time.Time
        }{
            {"Date of start of presumption of conformity (1)", &startDate},
            {"Date of start of presumption of conformity with restriction (4)", &restrictionStartDate},
            {"Date of withdrawal from OJ (end of presumption of conformity) (6)", &withdrawalDate},
        }

        // 批量遍历解析
        for _, field := range timeFields {
            t, err := parseTime(timeLayout, row[field.key])
            if err != nil {
                return nil, err
            }
            *field.target = t
        }
        // 后续业务逻辑...
    }
    // 后续返回逻辑...
}

优势:

  • 新增解析字段仅需在配置数组中增加一行映射关系,无需重复编写解析和错误判断代码
  • 所有待解析字段统一管理,结构清晰,后续维护成本更低

内容的提问来源于stack exchange,提问作者warvariuc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:39:03