这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
Day4
高质量编程
课程介绍
本节主要简要介绍了高质量编程的定义和原则,分享了代码格式、注释、命名规范、控制流程、错误和异常处理五方面的常见编码规范。
高质量编程简介
高质量:代码正确可靠、简洁清晰。边界、异常、易读易维护。
-
简单性
逻辑简单清晰
-
可读性
是写给人看的的
-
生产力
团队整体工作效率
编码规范
如何高质量编码?
代码格式
-
gofmt:能自动格式化为官方统一风格
-
goimports = gofmt + 依赖管理:
自动增删依赖的包引用、将依赖包按字母序排序并分类。
注释
- 代码的作用
- 代码如何做的
- 代码实现的原因
- 代码什么情况会出错
- 公共符号始终要注释
注释多也可能是坏代码。
命名规范
-
变量
-
简洁 > 冗长
for 循环中,索引名 i > index
-
缩略词全大写,除非位于变量开头且不需要导出(类似private)
ServerHTTP、xmlHTTPRequest
-
变量声明离使用越远,变量名需要携带越多上下文信息
-
-
函数
- 函数名不要携带包名的信息,因为包名和函数名总成对出现
- 函数返回类型与包名不同时,可以在函数名中加入类型信息
- 函数名尽量简短
-
包
- 只由小写字母组成
- 简短并包含一定上下文信息
- 不使用常用变量名
- 使用单数(strings.Split?)
- 谨慎地使用缩写
控制流程
- 避免嵌套,保持正常流程清晰
- 尽量保持正常代码路径为最小缩进
- 优先处理错误/特殊情况,尽早返回或继续循环以减少嵌套
错误和异常处理
- 简单错误
- 指仅出现一次的错误,且其他地方不需要捕获它
- 优先使用errors.New表示简单错误
- 使用fmt.Errorf来格式化错误
- 错误的wrap和unwrap
- 错误的wrap会使error嵌套,生成error的跟踪链
- fmt.Errorf("[Error]: %w", err)关联错误链
- 错误判定
- errors.Is() 可以判定错误链上是否含有特定错误
- panic
- panic用于真正的异常情况
- 不建议在业务代码中使用panic
- 当程序启动阶段发生不可逆转的错误时,可以在init()或main()中使用panic
- 调用函数不包含recover会造成程序崩溃
- 若问题可以被屏蔽或解决,建议使用error代替panic
- recover
- 嵌套无效
- 只在当前goroutine的被defer的函数中生效
- defer的语句是后进先出(栈式调用)
- recover后可以在log中记录当前的调用栈 debug.Stack()