Golang 常用的 checkstyle 有 golangci-lint 和 golint,golangci-lint 用于许多开源项目中。
$ git clone https://github.com/golang/lint.git
$ cd lint/golint
$ go install
在 GOBIN
目录下会生成一个可执行文件。
$ golint -h
Usage of golint:
golint [flags] # runs on package in current directory
golint [flags] [packages]
golint [flags] [directories] # where a '/...' suffix includes all sub-directories
golint [flags] [files] # all must belong to a single package
Flags:
-min_confidence float
minimum confidence of a problem to print it (default 0.8)
-set_exit_status
set exit status to 1 if any issues are found
# 不能使用下划线命名法,使用驼峰命名法
don't use ALL_CAPS in Go names; use CamelCase
# 外部可见程序结构体、变量、函数都需要注释
exported function Xxx should have comment or be unexported
# 通用名词要求大写
# iD/Id -> ID
# Http -> HTTP
# Json -> JSON
# Url -> URL
# Ip -> IP
# Sql -> SQL
var statJsonByte should be statJSONByte
var taskId should be taskID
# 包命名统一小写不使用驼峰和下划线
don't use an underscore in package name
don't use MixedCaps in package name; xxXxx should be xxxxx
# 注释第一个单词要求是注释程序主体的名称,注释可选不是必须的
comment on exported type Repo should be of the form "Repo ..." (with optional leading article)
# 外部可见程序实体不建议再加包名前缀
type name will be used as user.UserModel by other packages, and that stutters; consider calling this Model
# if语句包含return时,后续代码不能包含在else里面
if block ends with a return statement, so drop this else and outdent its block
# 建议写成 fmt.Errorf(…)
should replace errors.New(fmt.Sprintf(...)) with fmt.Errorf(...) errors.New(fmt.Sprintf(...))
# receiver名称不能为this或self
receiver name should be a reflection of its identity; don't use generic names such as "this" or "self"
# 错误变量命名需以 Err/err 开头
error var SampleError should have name of the form ErrSample
# a+=1应该改成a++,a-=1应该改成a--
should replace num += 1 with num++
should replace num -= 1 with num--
文档:https://golangci-lint.run/
GitHub地址:https://github.com/golangci/golangci-lint/
$ go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.42.0
在 GOBIN
目录下会生成一个可执行文件。
$ golangci-lint -h
Smart, fast linters runner. Run it in cloud for every GitHub pull request on https://golangci.com
Usage:
golangci-lint [flags]
golangci-lint [command]
Available Commands:
cache Cache control and information
completion generate the autocompletion script for the specified shell
config Config
help Help
linters List current linters configuration
run Run the linters
version Version
Flags:
--color string [32mUse color when printing; can be 'always', 'auto', or 'never'[0m (default "auto")
-j, --concurrency int [32mConcurrency (default NumCPU)[0m (default 8)
--cpu-profile-path string [32mPath to CPU profile output file[0m
-h, --help help for golangci-lint
--mem-profile-path string [32mPath to memory profile output file[0m
--trace-path string [32mPath to trace output file[0m
-v, --verbose [32mverbose output[0m
--version [32mPrint version[0m
Use "golangci-lint [command] --help" for more information about a command.
$ golangci-lint run -h
1、检查当前目录下所有的文件
$ golangci-lint run
# 等同于
$ golangci-lint run ./...
2、可以指定某个目录和文件
# golangci-lint run [目录]/[文件名]
$ golangci-lint run dir1 dir2/... dir3/file1.go
检查 dir1 和 dir2 目录下的代码及 dir3 目录下的 file1.go 文件
3、可以通过 --enable/-E 开启指定 Linter,也可以通 --disable/-D 关闭指定 Linter
$ golangci-lint run --disable-all -E errcheck
支持的linter参数设置:https://golangci-lint.run/usage/linters/
4、设置总工作超时时间
$ golangci-lint run ./... --timeout=10m
有的时候会需要禁用 lint 检查,可以在需要禁用检测的函数或者语句附近这样使用。
忽略某一行所有 linter 的检查:
var bad_name int //nolint
var bad_name int //nolint:all
忽略某一行指定 linter 的检查,可以指定多个 linter,用逗号隔开:
var bad_name int //nolint:golint,unused
忽略某个代码块的检查:
//nolint:all
func allIssuesInThisFunctionAreExcluded() *string {
// ...
}
//nolint:govet
var (
a int
b int
)
也可以在添加 nolint 的时候添加注释:
//nolint:gocyclo // This legacy function is complex but the team too busy to simplify it
func someLegacyFunction() *string {
// ...
}
忽略某个文件的指定 linter 检查:
//nolint:unparam
package pkg
在使用 nolint 的过程中,有 3 个地方需要你注意:
首先,如果启用了 nolint,你就需要在 //nolint 后面添加 nolint 的原因 // xxxx。
其次,你使用的应该是 //nolint 而不是 // nolint。因为根据 Go 的规范,需要程序读取的注释 // 后面不应该有空
格。
最后,如果要忽略所有 linter,可以用 //nolint;如果要忽略某个指定的 linter,可以用
//nolint:<linter1>,<linter2>,
。