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

参考:


最后修改 November 23, 2024: fix golangci-lint (94ad727)