高质量编程与性能调优6 | 青训营笔记

62 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

  • 线性原理(参考资料里有详细说明),处理逻辑尽量走直线,避免复杂的嵌套分支
  • Go 语言代码不是成功的路径越来越深地嵌套到右边,而是随着函数的执行,正常流程代码会沿着屏幕向下移动
  • 一个功能如果可以通过多个功能的线性结合来实现,那它的结构就会非常简单。反过来,用条件分支控制代码、毫无章法地增加状态数等行为会让代码变得难以理解。需要避免这些行为,提高代码的可读性。
  • 如果能让正常流程自上而下、简单清晰地进行处理,代码的可读性就会大幅提高,与此同时,可维护性也将提高,添加功能等改良工作将变得更加容易
  • 故障问题大多出现在复杂的条件语句和循环语句中,在维护这种逻辑时,添加功能会变成高风险的操作,很容易遗漏部分条件导致问题
  • 之前提到的都是程序正常工作时相关的规范,但是实际程序运行中,难免遇到错误或者异常情况,需要如何处理呢?
  • 这部分就介绍错误和异常处理的相关规范
  • 首先看一下简单错误
  • 简单的错误指的是仅出现一次的错误,且在其他地方不需要捕获该错误
  • 优先使用 errors.New 来创建匿名变量来直接表示简单错误
  • 如果有格式化的需求,使用 fmt.Errorf
  • 示例是go仓库中的一段代码,定义了简单错误描述失败原因
  • 对于复杂的错误,有时候并不能简单描述,应该如何处理?
  • 错误的包装提供了一个error嵌套另一个error的能力,生成一个error的跟踪链,同时结合错误的判定方法来确认调用链中是否有关注的错误出现。这个能力的好处是每一层调用方可以补充自己对应的上下文,方便跟踪排查问题,确定问题的根本原因在哪里
  • 在fmt.Errorf中使用: %w关键字来将一个错误wrap至其错误链中