高质量编程
什么是高质量
1.各种边界条件是否考虑完备 2.异常情况处理,稳定性保证 3.易读易维护
编程原则
1.简单性(消除“多余的复杂性”) 2.可读性(代码写给人看) 3.生产力(团队整体工作效率)
编码规范
代码格式
公共符号始终要注释
①包中声明的每个公共的符号变量、常量、函数以及结构都需要添加注释 ②任何既不明显也不简短的公共功能必须予以注释 ③无论长度或复杂程度如何对库中的任何函数都必须进行注释
推荐使用gofmt自动格式化代码
注释
常见注释应该做的
注释应该解释代码作用(注释公共符号) 注释应该解释代码如何做的(注释实现过程) 注释应该解释代码实现的原因(解释代码的外部因素) 注释应该解释代码什么情况会出错(解释代码的限制条件)
命名规范
1.简洁胜于冗长
2.缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写
例如使用 ServeHTTP 而不是 ServeHttp
使用 XMLHTTPRequest 或者 xmIHTTPRequest
3.变量距离其被使用的地方越远,则需要携带越多的上下文信息 全局变量在其名字中需要更多的上下文信息,使得在不同地方可以轻易辨认出其含义
核心目标是降低阅读理解代码的成本
重点考虑上下文信息,设计简洁清晰的名称
控制流程
1.避免嵌套,保持正常流程清晰 如果两个分支都包含return语句,则可去除冗余的else
//bad
if foo{
return x
}else{
return nil
}
//good
if foo{
return x
}
return nil
2.尽量保持正常代码路径为最小缩进
优先处理错误情况/特殊情况,尽早返回或继续循环来减少嵌套
错误和异常处理
简单错误
简单的错误指的是仅出现一次的错误,且在其他地方不需要捕获该错误
优先使用 errorsNew 来创建匿名变量来直接表示简单错误
如果有格式化的需求,使用 fmt.Errorf
错误的 Wrap 和 Unwrap
错误的 Wrap 实际上是提供了一个 error 嵌套另一个error 的能力,从而生成一个 error 的跟踪链
在 fmt.Errorf 中使用: %w 关键字来将一个错误关联至错误链中
错误判定
在错误链上获取特定种类的错误,使用errors.As
recover
recover 只能在被 defer 的函数中使用嵌套无法生效
只在当前 goroutine 生效
defer 的语句是后进先出