Go Engineering - Foundation - Linting
golangci-lint 优点
- 速度快
- 基于 gometalinter 开发,平均速度比 gometalinter 快 5 倍
- 并行检查代码 + 复用 go build 缓存 + 缓存分析结果
- 可配置
- 支持 YAML 格式的配置文件
- IDE 集成
- VS Code + Goland
- Linter 聚合器
- 集成了很多 Linter,无需单独安装,并且支持自定义 Linter
- 最小误报数
- 调整了所集成的 Linter 的默认设置,大幅减少误报
- 良好的输出
- 检查出问题的源码文件、行号和错误行内容
- 不符合检查规则的原因
- 报错的 Linter
- 更迭速度快
- 不断有新的 Linter 被集成进来
- 使用者:Google、Facebook、Istio、Red Hat OpenShift 等
golangci-lint 命令
cache
1 | $ golangci-lint cache status |
config
1 | $ golangci-lint config path |
linters
1 | $ golangci-lint linters |
golangci-lint 配置
同时在命令行选项和配置文件中被指定,如果是
bool/string/int
,则命令行选项覆盖配置文件,如果是slice
,则合并
命令行选项
配置文件
默认的配置文件名:
.golangci.yaml
、.golangci.toml
、.golangci.json
常用配置
1 | run: |
建议按需启用 linters
1 | linters: |
1 | $ ./scripts/print_enable_linters.sh |
查看当前配置下启用和禁用了哪些 linter
1 | $ golangci-lint help linters |
常规用法
对当前目录以及子目录下的所有 Go 文件进行 Linting
1 | $ golangci-lint run |
对指定的 Go 文件或者指定目录下的 Go 文件(dir1下目录为非递归)进行 Linting
1 | $ golangci-lint run dir1 dir2/... dir3/file1.go |
根据指定配置文件,进行 Linting
1 | $ golangci-lint run -c .golangci.yaml ./... |
运行指定的 linter,默认会从当前目录向上递归查找配置文件,
--no-config
可以预防读到未知的配置文件
1 | $ golangci-lint run --no-config --disable-all -E errcheck ./... |
禁止运行指定的 linter
1 | $ golangci-lint run --no-config -D godot,errcheck |
减少误报
- 在命令行中添加
-e
参数,或者在配置文件的issues.exclude
部分设置要排除的检查错误 - 忽略指定目录下的所有 Go 文件或者指定的 Go 文件
run.skip-dirs
、run.skip-files
、issues.exclude-rules
- 通过在 Go 源码文件中添加
//nolint
注释,来忽略指定的代码行- golangci-lint 设置了很多 linters,不同位置的 nolint 标记效果也会不一样
忽略某一行所有 linter 的检查
1 | var bad_name int //nolint |
忽略某一行指定 linter 的检查,可以指定多个 linter,
,
分隔
1 | var bad_name int //nolint:golint,unused |
忽略某个代码块的检查
1 | //nolint |
忽略某个文件的指定 linter 检查
1 | //nolint:unparam |
如果启用了 nolintlint,需要在
//nolint
后面添加原因// xxxx
1 | import "crypto/md5" //nolint:gosec // this is not used in a secure application |
是
//nolint
,而不是// nolint
,依据 Go 规范,需要程序读取的注释//后面不应该有空格
经验技巧
降低修改压力
第一次使用 golangci-lint 检查代码,会有很多错误
- 按目录检查代码并修改
- 只检查新增代码:
golangci-lint run --new-from-rev=HEAD~1
提高修改效率
- 按文件修改,减少文件切换次数
1 | $ golangci-lint run ./... | grep pkg/storage/redis_cluster.go |
适当增大 linters-setting.lll.line-length
- 默认为 80,建议修改为 120 或者 240
使用集成的 linter
每个 linter 都有两个属性:
fast
和auto-fix
- fast
- 为 true 时,说明该 linter 可以缓存类型信息(第一次执行),支持快速检查
- auto-fix
- 为 true 时,说明该 linter 支持自动修复发现的错误
尽可能多的使用 linter,如果时间和精力允许,建议打开 golangci-lint 提供的所有 linter
其他
- 每次修改代码后,都要执行
golangci-lint
– 及时修正 + 减轻后续的修改压力 - 在根目录放一个通用的 golangci-lint 配置文件
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.