DAY3 GO语言高质量编程以及性能调优 | 青训营

59 阅读3分钟

代码优化:

高质量代码的定义

  1. 各种边界情况考虑完备
  2. 异常情况处理完善,代码运行稳定性有保证
  3. 易读易维护

代码格式
推荐使用的官方工具:
gofmt可以自动将代码格式化为官方统一风格
goimports相当于gofmt加上依赖包管理
注释
注释负责解释本段代码的作用,是如何制作的,实现的原因,和代码在什么情况下会出错等

  1. 公共符号需要注释,比如函数和公共变量等
  2. 代码的实现过程需要注释
  3. 代码实现的原因需要注释,比如本段代码的外部因素,额外提供代码全局的context等
  4. 代码的出错情况需要注释,适合解释本段代码的限制条件(代码在什么输入情况下会报错,全局代码对本段代码有什么可能影响会导致报错)
  5. 无论复杂与否,公共符号必须有注释,包括变量,常量,函数等
  6. 例外:接口(interface)不需要注释实现的方法

命名规范
缩略词需要全大写,但是当其位于变量开头且不需要输出的时候,需要使用全小写(例子:ServeHTTP,HTTP需要全大写)
全局变量的名字中需要加入更多信息,因为全局变量有可能会在整段代码的任何地方出现,需要携带更多信息量才能使代码更加简单易读 代码的命名原则是简洁但是不会丢失信息(例子:变量名index和i,信息并没有丢失,简洁原则所以选择变量名i)
函数的命名中不应该包含包的名字(例子:package time中的获取现在时间的函数名字应该为Now()而不是NowTime(),因为调用函数的时候格式为time.Now(),time.NowTime()十分冗余)
package命名只由小写字母组成,尽量不和标准库中的package名字相同

编码规范

  1. 避免嵌套,保持流程正常清晰,如果两个分支中都包含return语句,则可以去除冗余的else
    例子:if(){return x} else {return y}可以改成if(){return x} return y
  2. 优先处理错误或者特殊情况,尽早跳出循环来减少嵌套
  3. 线性原则:代码尽量走直线(就是一直往下走),不要出现从第几百行代码跳出嵌套跳回第二行的这种情况。故障问题大多数都出现在复杂的嵌套语句中
  4. 错误和异常处理:
    1. 简单错误:指的是只会出现一次且在代码其他地方不需要捕获的错误,可以用errors.New来创建匿名变量来直接表示简单错误
    2. error的Wrap和Unwrap:Wrap给error提供了一个可以嵌套另一个error的能力,用Wrap可以生成一个error的跟踪链
    3. error判定:判断一个error是否为特殊error,可以使用error.ls。不同于==,error.ls可以个Wrap结合使用来判定错误链上是否含有特定的error;使用error.As可以在错误链上获取特定种类的error
    4. panic和recover:panic通俗一点来说就是程序宕机,所以在业务代码中不建议使用,若是调用不含recover的函数就会导致程序崩溃;若问题可以被屏蔽或者解决,建议用error来代替panic。recover只能在defer的函数中被使用,而defer的特点就是后进先出。对于recover,嵌套无法生效(defer语句会在函数返回前调用,所以遵循后进先出原则)