[Go高质量编程 & 性能调优 | 青训营笔记]

49 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 3 天。

今天,我主要学习了Go语言的高质量编程和性能调优的相关知识点。

一、Go高质量编程

我们之前提到过,Go语言语法较为简单明了,并且IDE会对代码进行强行格式化,这是有利于多人协作开发的(不会像C/C++那样一人一码风了)。不过,一些命名和编写规范在Go中仍然如下:

1.1 合适的取名

代码是给人看的,而不是给电脑看的,因此我们往往需要给变量/函数/包等进行合适的命名。

Go是一门相对简洁明了的语言,因此在变量命名上也秉持了简单易懂的规范,而不是像Java那样,随便一个循环里面的临时变量都得三四个单词拼凑起来,但我们也得在简洁性和语义性上做出平衡:

  1. 对于循环内的变量可以尽量简略

    例如说经典的 for i := 0; i < 10; i++,我们无需使用 index 或者其他更具有特性的单词来代替 i,因为 i 已经足够简洁明了的表达了代码的含义

  2. 命名可以和包名相结合

    例如说http包(一个处理Web请求的包)里面的处理函数,相比于serveHTTP,我个人认为只需要取名为 serve 即可(已经是 http 包里面的函数了,不是处理 HTTP 还能是谁呢)

  3. 不要引发歧义

    假设time库里面有一个将字符串转换为时间类型的函数 prase,那么我们就需要特别标明其是用于转换瞬时时间的还是持续时间的。相反,对于取当前时间这种操作,我们只需要一个简单的 Now 即可

1.2 异常处理

Go语言中的异常处理并不是和Java或者C++那样进行try-catch操作,而是正常的返回与查询,如下:

 res, err := solve()
 if err != nil {
     
 }

对于很多普通的程序员,他们往往就直接return就完事了。相反,我们应该使用一些日志管理工具来记录当前的错误情况。就算不行,也要在错误流中(类似stderr这种)报告异常,以便运维/测试/其他开发人员后续排查。

二、Go性能调优

作为一个算法竞赛的老选手,我对于性能调优这东西太熟了:

  1. 算法复杂度优化(通过改变算法的方式实现时间复杂度/空间复杂度的下降),但是我们往往需要进行取舍(时空往往无法兼顾;优秀算法往往写起来困难,从而引入bug或难以扩展)
  2. 程序效率优化(俗称“卡常数”),使用一些技巧来降低一些代码的运行时间,从而提高效率(例如map[string]bool,把bool用struct{}代替,因为前者占用了一个字节,而后者不用)

前者的话,我个人觉得在普通工程开发中未必十分重要,因为业务逻辑的实现往往才是首位的,后者就更没有必要了,因为卡常数行为往往会大幅度降低代码的可读性。

当然,如果是底层引擎之类的高性能要求的场合当我没说,这种必然得效率第一。

为了统计效率,我们可以使用一些工具来进行查看和分析,例如pprof。