golang有没有类似于c++中的cppcheck静态代码检测工具呢?答案是有的,今天向大家推荐一个工具golangci-lint, 主要是安装和使用的时候遇到不少了坑,分享出来供大家避坑;
以下是window下安装方法,结合vscode使用, 其他平台也可以参考
使用命令: go get -u github.com/golangci/golangci-lint/cmd/golangci-lint
一般的第三方工具通过上面方法基本能安装成功,无非就是下载慢点,可golangci-lint就是不按照套路来,很不幸,通过上面方法,除非你的golang版本与最新的golangci-lint版本一致,否则,就会报以下错误:
# github.com/golangci/golangci-lint/internal/cache ..\..\..\..\github.com\golangci\golangci-lint\internal\cache\default.go:76:15: undefined: os.UserCacheDir # github.com/golangci/golangci-lint/vendor/honnef.co/go/tools/config ..\..\..\..\github.com\golangci\golangci-lint\vendor\honnef.co\go\tools\config\config.go:23:17: undefined: os.UserCacheDir # github.com/golangci/golangci-lint/vendor/honnef.co/go/tools/internal/cache ..\..\..\..\github.com\golangci\golangci-lint\vendor\honnef.co\go\tools\internal\cache\default.go:76:15: undefined: os.UserCacheDir # github.com/golangci/golangci-lint/vendor/honnef.co/go/tools/ssa ..\..\..\..\github.com\golangci\golangci-lint\vendor\honnef.co\go\tools\ssa\builder.go:61:16: undefined: types.NewInterfaceType
上述方法之所以安装不成功,主要是golang版本和golangci-lint版本不一致导致导致的;
go < 1.9 isn't supported go1.9 is officially supported by golangci-lint <= v1.10.2 go1.10 is officially supported by golangci-lint <= 1.15.0. go1.11 is officially supported by golangci-lint <= 1.17.1. go1.12+ are officially supported by the latest version of golangci-lint (>= 1.18.0).
https://github.com/golangci/golangci-lint/releases
如我的go1.10, 需要用golangci-lint-1.15.0版本
解压后将golangci-lint.exe
文件直接放到GOPATH\bin
目录下就可以直接使用了
该命令可以在vscode的终端下直接使用
命令格式: golangci-lint run [目录]/[文件]
错误使用方式,又一个不按套路来的命令,文件我们一般习惯用“*”表示,但golangci-lint 确不认这种方式,会报如下错误:
执行命令:golangci-lint run ./iss/*
报错:
level=error msg="[runner/typecheck] typechecking error: cannot find package \"XXXX/iss/*\" in any of:XXXX\\iss\\* (from $GOROOT)\n\tXXXX\\iss\\* (from $GOPATH)" level=warning msg="[runner/megacheck] Can't run megacheck because of compilation errors in packages [xxxxx/iss/*]: -: cannot find package \"xxxx/iss/*\" in any of:\n\txxxx\\iss\\* (from $GOROOT)\n\txxxx\\iss\\* (from $GOPATH)"
官网推荐三种使用方式:
golangci-lint run
golangci-lint run ./...
这里...
代表的就是检测目录下所有的文件
golangci-lint run dir1 dir2/... dir3/file1.go