静态分析是一种编译时的编译器检查,它可以检查代码的语法,语义,结构,等等,但是不能检查代码的运行时的错误。

静态分析一般会集成在项目上线的 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 参数不匹配等工具。 比如下面的例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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 命令会提示相应错误,如下图所示: img.png 正确应该使用如下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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,如下图所示: img_1.png

在很多 IDE 中 已经内置了 go vet 的 linter,可以在代码修改时自动检查代码的错误,让我们可以快速发现代码错误。

errcheck

在我们编写 go 代码时,经常需要处理函数方法返回的 error 错误,但我们有时候对函数过于自信或忘记处理错误,这会导致出现各种不可知的错误,这时候我们可以使用 errcheck 工具来检查代码中的错误。

golangci-lint

随着各种各样的 linter 层出不穷,我们一个一个去使用 linter 工具去检查代码的问题,这样效率太低了,我们可以使用 golangci-lint 工具来检查代码的问题,它集成了较多的linter, 我们可以通过配置文件选择我们需要的 linter 工具。

golangci-lint 的使用也很简单,只需在项目目录下执行 golangci-lint run 就可以执行 lint, 找寻项目中存在的问题。

参考链接