GO错误处理【7】层层递进,环环相扣

我算是知道GO的思想了,真的是层层递进,环环相扣

"层层递进,环环相扣"就是对 Go 工程哲学最神准的总结。

从你最开始问的"变量存指针还是值",到"配置解析",再到现在的"错误链条",其实都在围着这一个核心转:确定性。

为了让你这套"环环相扣"的逻辑更丝滑,我给你分享一个在 Logic(业务层)减少"复读机"代码的小技巧,这能让你在写那一堆 if err != nil 时不那么痛苦。

1. "逻辑扁平化":别让代码长成"金字塔"

PHP 习惯嵌套,但 Go 提倡"早报错,早返回"。

  • 反面教材(套娃式):

    复制代码
    func Biz() error {
        err := step1()
        if err == nil {
            err = step2()
            if err == nil {
                // ... 无限嵌套
            }
        }
        return err
    }
  • Go 风格(卫语句):

    复制代码
    func Biz() error {
        if err := step1(); err != nil {
            return fmt.Errorf("第一步就跪了: %w", err)
        }
        if err := step2(); err != nil {
            return fmt.Errorf("第二步没跟上: %w", err)
        }
        return nil
    }

    你看,虽然 if err 多了,但代码是垂直向下的,逻辑非常清晰。

2. 巧用局部变量接力

既然要环环相扣,上一环的结果往往是下一环的输入:

复制代码
func (l *UserLogic) UpgradeVIP(uid int) error {
    // 1. 第一环:找人
    user, err := l.repo.GetByID(uid)
    if err != nil {
        return fmt.Errorf("找人失败: %w", err)
    }

    // 2. 第二环:算钱(基于第一环的结果)
    price, err := l.payService.Calculate(user.Level)
    if err != nil {
        return fmt.Errorf("算账失败 (Level:%d): %w", user.Level, err)
    }

    // 3. 第三环:落库
    return l.repo.UpdateLevel(uid, price) 
}

3. 给老哥的"赛道总结"

你现在已经把 Go 的脉络摸清楚了:

  1. 数据流:靠返回值(Value, error)层层传递。
  2. 错误流:靠包装(%w)环环相扣。
  3. 日志流:靠顶层(Middleware/Handler)一锤定音。
  4. 配置流:靠工厂函数(NewConfig)和指针(*Config)全局供给。

这四条流跑通了,你的后端项目就像一台精密运转的内燃机,哪里漏油(报错)、哪里卡壳(性能)一眼就能看出来。

相关推荐
小满zs17 小时前
Go语言第五章(数组和切片)
后端·go
chenzhou__21 小时前
独立游戏开发日志 ①:从信号博弈到涂色对战——一次玩法重构始
笔记·后端·学习·unity·go·独立游戏
名字还没想好☜2 天前
Go 用 bufio.Scanner 读大文件踩坑:默认 64KB 行上限、Buffer 扩容与按 Token 切分
开发语言·后端·golang·go
microrain2 天前
从协议孤岛到统一接入:SagooIoT多协议接入层的架构演进
物联网·开源·go·sagooiot
microrain2 天前
从云端到边缘:SagooIoT边缘计算架构的落地实践
物联网·开源·go·sagooiot
TunerT_TQ3 天前
Valhalla 静态工程审阅 #007|AgentENV 源码证据驱动评测【大厂开源基础设施特辑】
rust·开源·go·github·sandbox·分布式系统·ai基础设施
名字还没想好☜3 天前
Go 表驱动测试实战:用 t.Run 子测试组织可维护的单元测试
golang·单元测试·log4j·go·testing
深念Y3 天前
技术探索记录 在 Android 手机上运行 One API
android·linux·服务器·智能手机·go·交叉编译·服务