静态分析是一种编译时的编译器检查,它可以检查代码的语法,语义,结构,等等,但是不能检查代码的运行时的错误。
静态分析一般会集成在项目上线的 Ci 流程中,如果过程中出现了错误,那么项目就不能上线,避免了有问题的代码被部署上线。
常见的 go linter
在 go 语言社区中,已经有了很多的 linter,这些 linter 可以帮助我们检查代码的语法,语义,结构等等,接下来我来介绍一些常见的linter。
go lint
go lint 是go 官方推出的最早的 linter, 它可以检查导出函数是否有注释, 变量、函数等名称是否符合官方规范。 随着近年来的发展,各种 linter 已经层出不穷了, go lint 已经被 deprecated and frozen 了,官方推荐使用 Staticcheck 和 go vet 等linter。
go vet
go vet 也是官方提供的静态分析工具,其内置了锁拷贝检查、循环变量捕获问题、printf 参数不匹配等工具。 比如下面的例子:
package main
import "sync"
func main() {
var wg sync.WaitGroup
for _, v := range []int{0,1,2,3} {
wg.Add(1)
go func() {
print(v)
wg.Done()
}()
}
wg.Wait()
}
执行 go vet 命令会提示相应错误,如下图所示: 正确应该使用如下代码:
package main
import "sync"
func main() {
var wg sync.WaitGroup
for _, v := range []int{0,1,2,3} {
wg.Add(1)
v := v
go func() {
print(v)
wg.Done()
}()
}
wg.Wait()
}
执行 go tool vet help 可以看到 go vet 已经内置了一些 linter,如下图所示:
在很多 IDE 中 已经内置了 go vet 的 linter,可以在代码修改时自动检查代码的错误,让我们可以快速发现代码错误。
errcheck
在我们编写 go 代码时,经常需要处理函数方法返回的 error 错误,但我们有时候对函数过于自信或忘记处理错误,这会导致出现各种不可知的错误,这时候我们可以使用 errcheck 工具来检查代码中的错误。
golangci-lint
随着各种各样的 linter 层出不穷,我们一个一个去使用 linter 工具去检查代码的问题,这样效率太低了,我们可以使用 golangci-lint 工具来检查代码的问题,它集成了较多的linter, 我们可以通过配置文件选择我们需要的 linter 工具。
golangci-lint 的使用也很简单,只需在项目目录下执行 golangci-lint run 就可以执行 lint, 找寻项目中存在的问题。