
1.4 分析与审查
虽然go fmt
可以确保代码格式正确,但这只是确保代码符合Go语言惯例且高质量的第一步。所有的Go开发者都应该阅读Effective Go(https://oreil.ly/GBRut)和Go wiki(https://oreil.ly/FHi_h)上的Code Review Comments页面,以了解什么样的代码符合Go语言惯例。
有一些工具可以帮助增强这种风格。第一个工具叫作golint
。术语“linter”来自贝尔实验室的UNIX团队,第一个linter写于1978年。golint
试图确保代码遵循风格准则。它建议的一些更改包括:正确地命名变量、格式化错误信息,以及在公共方法和类型上添加注释。这些都不是错误,不会导致程序无法编译或运行不正确。此外,你不能自动假设golint
是100%准确的,因为golint
发现的问题类型比较模糊,所以有时会出现错误的分析结果。这意味着不必完全按照golint
的建议进行修改,但你应该认真对待golint
的建议。Go开发者希望代码遵循良好的代码规范,否则会出现很多问题。
安装golint
:

运行:

这样就可以在整个项目中运行golint
。
开发者还会遇到另外一种错误:代码在语法上是正确的,但是出现一些你不愿意看到的错误。诸如给格式化方法传递了错误的参数数量,或者给从未使用过的变量赋值。使用go
工具集中名为go vet
的命令来检测这类错误。用下面的命令在代码上运行go vet
:

还可以用额外的第三方工具来检查代码格式和扫描潜在的bug。然而,在代码上运行多个工具会降低构建速度,因为每个工具都要花费时间扫描源代码。因此,与其使用单独的工具,不如使用golangci-lint
(https://oreil.ly/O15u-)同时运行多个工具。golangci-lint
结合了golint
、go vet
和不断增加的其他代码质量工具集。
一旦安装了它(https://oreil.ly/IKa_S),你就可以用以下命令运行golangci-lint
:

由于golangci-lint
运行了如此多的工具(截至本书撰写时,它默认运行10种不同的linter,并有另外50种可以启用),所以你的团队难免对其中的一些建议产生异议。你可以通过在项目根部加入一个名为.golangci.yml的文件来配置启用哪些linter以及分析哪些文件。请参阅文档(https://oreil.ly/vufj1)了解文件格式。
建议在一开始使用go vet
作为自动构建过程的必要部分,并使用golint
作为代码审查过程的一部分(因为golint
可能会有错误的分析结果,你不能要求团队修复它报告的每个问题)。一旦你习惯了他们的建议,可以尝试golangci-lint
并调整它的设置,直到它适合你的团队。
将
golint
和go vet
(或golangci-lint
)作为开发流程的一部分,可以避免常见的bug和不规范的代码。但如果你正在使用golangci-lint
,请确保你的团队同意你要执行的规则。