高质量编程
目标
- 编写更简洁清晰的代码:便于阅读与合作,用清晰的代码写出思路
- 常用的Go语言程序优化手段
- 熟悉Go程序性能分析工具
- 了解工程中性能优化的原则和流程
什么是高质量编程
-
编写的代码正确可靠、简洁清晰
-
目标:
- 边界条件完备
- 异常处理
- 易读易维护
-
原则
- 简单性:以简单清晰的逻辑编写代码(易于修复改进)
- 可读性:确保代码可读以编写可维护的代码(让人看得懂)
- 生产力:团队整体工作效率非常重要(代码风格、规范、质量等)
编码规范
-
代码格式:gofmt是Go语言官方提供的工具,能自动格式化Go语言代码为官方统一风格
注释(提供额外的上下文信息)
-
解释代码作用
-
解释代码如何做的(大致的逻辑)
-
解释代码实现的原因
-
解释代码什么情况会出错
-
什么地方需要注释:
- 包中声明的每个公共的符号:变量、常量、函数以及结构都需要添加注释
- 任何既不明显也不简短的公共功能必须予以注释
- 无论长度或复杂程度如何对库中的任何函数都必须进行注释
- 实现接口的方法不需要注释
命名规范
-
简洁胜于冗长
-
缩略词全大写,但当其位于变量开头且不需要道出时使用全小写
- 例如ServeHTTP而不是ServeHttp
- 使用XMLHTTPRequest 或 xmlHTTPRequest
-
变量距离其被使用的地方越远则需要携带更多的上下文信息
- 距离被使用的地方很近时可以很短(例如for i:=0 ...)
- 全局变量需要最多的上下文信息
控制流程(让代码更简洁)
- 避免分支嵌套
- 优先处理错误或特殊情况,尽早返回或继续循环来减少嵌套
- 线性原理,处理逻辑尽量走直线,避免复杂的嵌套分支(正常流程代码沿着屏幕向下移动)
错误和异常处理
-
简单错误:
-
解释:只出现一次且在其他地方不需要捕获的错误
-
处理:直接用 errors.New 创建匿名变量表示错误
if(b==0){ return error.New("b=0") }
-
-
错误链
- Wrap提供一个error嵌套另一个error的能力以生成一个error的跟踪链
- 在fmt.Errorf中使用 %w 关键字来将一个错误关联至错误链中
-
list, _, err := c.GetBytes(10) if err!= nil{ return fmt.Errorf("error: %w", err) }
-
panic 和 recover 用于真正异常的情况,但是业务代码不建议使用
-