高质量编程及编码规范 | 青训营笔记

102 阅读2分钟

高质量编程

什么是高质量:代码正确可靠,简洁清晰
边界条件是否考虑完备、异常情况处理、稳定性保证、易读易维护
编程原则:简单性、可读性、生产力

代码格式

推荐使用gofmt自动格式化代码
goimports可以自动进行依赖包的管理

注释

注释解释代码作用、代码如何实现、代码实现的原因、代码什么情况下会出错
任何不明显不简短的公共功能需要注释,库中的任何函数必须进行注释
不需要注释实现接口的方法
注释要解释公共符号的意义
代码是最好的注释、注释提供代码未表达出的上下文信息

命名规范

简洁胜于冗长,缩略词全大写,但当其位于变量开头且不需要导出时使用全小写

函数名不携带包名的上下文信息,函数名尽量简短

包只有小写字母组成,不要与标准库同名,简短并包含一定的上下文信息,不使用常用变量名作为包名,使用单数而不是附属,谨慎地使用缩写

核心在于降低阅读理解代码的成本,重点考虑上下文信息,设计简洁清晰的名称

控制流程

避免嵌套,保证正常流程清晰

尽量保持正常代码路径为最小缩进,优先处理错误情况

线性原理,处理逻辑尽量走直线,避免复杂嵌套,正常流程代码沿着屏幕向下移动,故障大多出现在复杂的条件语句和嵌套语句中

错误和异常处理

简单错误:仅仅出现一次的错误,且在其他地方不需要捕获该错误,优先使用errors.New来创建匿名变量来直接表示简单错误,若有格式化需求,使用fmt.Errorf

错误的Wrap和Unwrap: 错误的Wrap实际上是提供了一个err嵌套另一个err的能力,从而实现一个err的跟踪链,在fmt.Errorf中使用%w关键字将一个错误关联至错误链中

错误判定:判定一个错误是否为特定错误使用errors.is

不建议在业务代码中使用panic

recover只能在defer的函数中使用,嵌套无法生效,只在当前goroutine生效 defer语句会在函数返回前调用,多个defer语句后进先出