今日课程
(入门小白学习Go的第三天,感觉强度好高,力不从心) 今天的内容主要是了解高质量编程的定义以及原则,学习代码格式、注释、命名规范、控制流程、错误和异常处理五方面的常见编码规范。 在本次课程中,可以学习到:
- 如何编写更简洁清晰的代码
- Go语言程序中常用的优化手段
- 熟悉Go程序性能分析工具
- 了解工程中性能优化的原则和流程
高质量代码
即正确可靠、简洁清晰的代码。可从如下几点大概判断:
- 是否易读易维护
- 稳定性保证、异常情况处理
- 各种边界条件是否考虑完备
编程原则
简单性
- 编写的代码应该逻辑清晰简单,利于后续的修改和维护
可读性
- 代码便于维护的前提是代码具有良好的可读性,毕竟代码是写给人看的而不是写给机器看的
生产力
- 团队整体的工作效率非常重要
编码规范
代码格式
- gofmt工具:利用官方提供的工具gofmt自动格式化Go语言代码为官方统一风格
- goimports工具: 也是官方工具,gofmt+依赖包管理
注释
代码是最好的注释,而注释应当提供代码未表达出的上下文信息
- 包中声明的公共符号:变量、常量、函数和结构都需要添加注释
- 任何既不明显也不简短的公共功能必须添加注释
- 对库中任何函数必须添加注释
命名规范
重点在于降低阅读和理解代码的成本
variable
- 简洁
- 缩略词全大写,但当位于开头且不需要导出时,全小写
- 变量距其使用的地方越远,则应携带越多上下文信息
function
- 函数名不携带包名上下文信息
- 函数名尽量简短
package
- 只用小写字母组成
- 简短并包含一定上下文信息
- 不与标准库同名
控制流程
逻辑尽量直接了当,减少嵌套分支,提升代码的可读性和可维护性
- 避免嵌套,保持正常流程清晰
- 尽量保持正常代码路径为最小缩进(即优先处理错误或特殊情况,尽早返回或继续循环来减小嵌套)
错误和异常处理
- error尽可能提供简明的上下文信息链,便于定位错误
- panic用于真正异常的情况
- recover应当注意适用范围
简单错误(仅出现一次的错误,且在其他地方不需要捕获该错误)
- 优先使用errors.New创建创建匿名变量来直接表示简单错误
- 如果有格式化需求,使用fmt.Errorf
错误的Wrap和Unwrap
Wrap实际上是提供一个error嵌套另一个error的能力,从而生成一个error跟踪链
错误判定
- 使用errors.ls来判断一个错误是否是特定错误
- 不同于==, 该方法可以判断错误链中是否含有特定错误
panic
- 不建议在业务代码中使用panic
- 调用函数不包含recover会导致程序崩溃
- 若问题可以被屏蔽或解决,建议使用error
当程序启动阶段发生不可逆转的错误时,可以在init或main函数中使用panic
recover
- 只能在被defer的函数中使用
- 嵌套无法生效
- 只能在当前goroutine生效
- defer的语句是后进先出