如何精简带错误校验的重复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
相关产品推荐
相关产品推荐

