代码优化:
高质量代码的定义:
- 各种边界情况考虑完备
- 异常情况处理完善,代码运行稳定性有保证
- 易读易维护
代码格式:
推荐使用的官方工具:
gofmt可以自动将代码格式化为官方统一风格
goimports相当于gofmt加上依赖包管理
注释:
注释负责解释本段代码的作用,是如何制作的,实现的原因,和代码在什么情况下会出错等
- 公共符号需要注释,比如函数和公共变量等
- 代码的实现过程需要注释
- 代码实现的原因需要注释,比如本段代码的外部因素,额外提供代码全局的context等
- 代码的出错情况需要注释,适合解释本段代码的限制条件(代码在什么输入情况下会报错,全局代码对本段代码有什么可能影响会导致报错)
- 无论复杂与否,公共符号必须有注释,包括变量,常量,函数等
- 例外:接口(interface)不需要注释实现的方法
命名规范:
缩略词需要全大写,但是当其位于变量开头且不需要输出的时候,需要使用全小写(例子:ServeHTTP,HTTP需要全大写)
全局变量的名字中需要加入更多信息,因为全局变量有可能会在整段代码的任何地方出现,需要携带更多信息量才能使代码更加简单易读
代码的命名原则是简洁但是不会丢失信息(例子:变量名index和i,信息并没有丢失,简洁原则所以选择变量名i)
函数的命名中不应该包含包的名字(例子:package time中的获取现在时间的函数名字应该为Now()而不是NowTime(),因为调用函数的时候格式为time.Now(),time.NowTime()十分冗余)
package命名只由小写字母组成,尽量不和标准库中的package名字相同
编码规范:
- 避免嵌套,保持流程正常清晰,如果两个分支中都包含return语句,则可以去除冗余的else
例子:if(){return x} else {return y}可以改成if(){return x} return y - 优先处理错误或者特殊情况,尽早跳出循环来减少嵌套
- 线性原则:代码尽量走直线(就是一直往下走),不要出现从第几百行代码跳出嵌套跳回第二行的这种情况。故障问题大多数都出现在复杂的嵌套语句中
- 错误和异常处理:
- 简单错误:指的是只会出现一次且在代码其他地方不需要捕获的错误,可以用errors.New来创建匿名变量来直接表示简单错误
- error的Wrap和Unwrap:Wrap给error提供了一个可以嵌套另一个error的能力,用Wrap可以生成一个error的跟踪链
- error判定:判断一个error是否为特殊error,可以使用error.ls。不同于==,error.ls可以个Wrap结合使用来判定错误链上是否含有特定的error;使用error.As可以在错误链上获取特定种类的error
- panic和recover:panic通俗一点来说就是程序宕机,所以在业务代码中不建议使用,若是调用不含recover的函数就会导致程序崩溃;若问题可以被屏蔽或者解决,建议用error来代替panic。recover只能在defer的函数中被使用,而defer的特点就是后进先出。对于recover,嵌套无法生效(defer语句会在函数返回前调用,所以遵循后进先出原则)