golangci-lint的使用
golangci-lint是一种go linter的工具,支持快速,可配置多种linter参数的功能。在go项目中使用golangci-lint可以帮助多人团队开发的代码风格及质量的一致性,同时也可以帮助开发者提高代码质量。可以结合Golang 代码规范配置golangci-lint的参数。
本文主要介绍该工具的使用及常见推荐配置。
1. golangci-lint安装
golangci-lint推荐在Makefile文件中配置安装和执行命令,参考如下Makefile内容:
## golangci-lint的安装及命令
GOLANGCI_LINT = $(shell pwd)/bin/golangci-lint
GOLANGCI_LINT_VERSION ?= v1.54.2
golangci-lint:
@[ -f $(GOLANGCI_LINT) ] || { \
set -e ;\
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell dirname $(GOLANGCI_LINT)) $(GOLANGCI_LINT_VERSION) ;\
}
.PHONY: lint
lint: golangci-lint ## Run golangci-lint linter & yamllint
$(GOLANGCI_LINT) run --timeout=10m
.PHONY: lint-fix
lint-fix: golangci-lint ## Run golangci-lint linter and perform fixes
$(GOLANGCI_LINT) run --fix
## 配置在build阶段执行lint命令
##@ Build
.PHONY: build
build: fmt vet lint ## Build manager binary.
bash hack/build.sh
可以在makefile中集成golangci-lint,同时集成到代码CI的流程中,在代码提交和merge前自动执行golangci-lint的操作。
通过执行make lint
的命令即可运行golangci-lint。
2. 配置参数说明
基础检测(推荐所有项目开启)
这些 linters 检查常见的代码错误和潜在问题:
govet
: [默认开启]Go 内置的静态分析工具,用于检查可能导致运行时错误的问题。gosimple
: [默认开启]提示可以简化的代码。staticcheck
: [默认开启]检测潜在错误、不良代码风格以及性能优化建议。errcheck
: [默认开启] 检查未处理的错误。ineffassign
: [默认开启] 检测无效的变量赋值。unused
: [默认开启]检测未使用的代码(变量、函数等)。
代码风格和一致性
这些 linters 确保代码风格一致,易于维护:
gofmt
: 强制格式化代码。goimports
: 格式化代码并管理导入的包。typecheck
: 检查类型错误。misspell
: 检测并修复拼写错误。stylecheck
: 提供风格建议,确保代码符合 Go 的约定。dupl
: 检测代码中的重复部分。wsl
: 确保if
语句等块代码之间有适当的空行。
复杂度和性能
用于优化代码的可读性和性能:
gocyclo
: 检测代码的圈复杂度,确保函数复杂度不会过高(默认阈值为 30)。funlen
: 检查函数和文件的长度(如上所述)。megacheck
: 组合了gosimple
,unused
, 和staticcheck
。prealloc
: 检测在大型切片中是否提前分配了容量。
安全性
检测安全问题,适合对代码安全性有要求的项目:
nakedret
: 检查是否有裸返回值,可能导致混淆或错误。gosec
: 检测常见的安全问题,例如 SQL 注入、弱密码等。maligned
: 检测结构体字段排列是否影响内存对齐。
3. golangci.yml推荐配置
可以通过.golangci.yml
配置文件来配置详细的lint参数,在项目的根目录下创建该文件。常用推荐配置如下:
为了可以精准控制开启的类型,可以把disable-all设置为true
,然后再根据团队需要逐步添加enable的类型,避免开启检查过多影响开发效率。
- linters:主要配置开启或关闭的检查类型。
- linters-settings:针对linters中的具体检查类型配置该类型的参数。
run:
timeout: "10m"
linters:
disable-all: true
enable:
# basic
- govet
- staticcheck
- errcheck
- ineffassign
- gosimple
- unused
# style
- gofmt
- goimports
- misspell
- stylecheck
- dupl
- wsl
- goconst
# complexity
- funlen
- gocyclo
- lll
# security
- gosec
linters-settings:
funlen:
# Checks the number of lines in a function.
lines: 80
# Checks the number of statements in a function.
statements: 40
# Ignore comments when counting lines.
ignore-comments: true
lines-in-file: 800
gocyclo:
# Minimal code complexity to report.
# Default: 30 (but we recommend 10-20)
min-complexity: 15
lll:
# Max line length, lines longer will be reported.
# Default: 120.
line-length: 120
dupl:
# Tokens count to trigger issue.
# Default: 150
threshold: 100
output:
format: colored-line-number
print-issued-lines: true
print-config: true
参考:
- https://golangci-lint.run/
- https://golangci-lint.run/usage/configuration/
- https://golangci-lint.run/usage/linters/
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.
最后修改 November 23, 2024: fix golangci-lint (94ad727)