golangci-lint Go 代码质量

FreeGuideOnline 最新 2026-07-14

bash curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin

安装完成后,确保 `$(go env GOPATH)/bin` 在你的 `PATH` 中。

### 方式二:通过 Go 直接安装
需要 Go 1.21 及以上版本。
```bash
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

方式三:使用包管理器

  • macOS(Homebrew)
    brew install golangci-lint
    
  • Linux(snap)
    sudo snap install golangci-lint
    
  • Windows(Scoop)
    scoop install golangci-lint
    

验证安装:

golangci-lint --version

第一次运行

进入任意 Go 项目目录,直接执行:

golangci-lint run

该命令会使用默认配置对项目进行审查。如果项目中存在已知问题,你会看到类似以下输出:

main.go:5:2: should not use T(context.Background()) in tests (exitAfterDefer)
main.go:8:14: Error return value is not checked (errcheck)

每一行都指出了文件、行号、问题描述以及对应的 linter 名称。

配置方式

默认配置就够了?

golangci-lint 的默认配置包含一组适用大多数项目的 linter,兼顾准确性和运行速度。你可以先用默认配置运行,根据反馈再调整。

创建配置文件 .golangci.yml

在项目根目录创建 .golangci.yml,可以细粒度控制启用的 linter、输出设置、运行规则等。一个典型的基础配置:

linters:
  enable:
    - errcheck
    - gosimple
    - govet
    - ineffassign
    - staticcheck
    - unused
linters-settings:
  errcheck:
    check-blank: true
run:
  timeout: 5m
  tests: true

更丰富的示例可从官方配置参考获取。

常用配置项说明

  • linters.enable:显式开启的 linter 列表。
  • linters.disable:关闭某些恼人或暂时不适用的 linter。
  • run.timeout:设置分析总超时,如 10m
  • run.skip-dirs:跳过的目录,如 vendorthird_party
  • issues.excludeissues.exclude-rules:通过正则或规则屏蔽已知警告。

集成到日常工作流

使用命令行快速检查

golangci-lint run ./...          # 检查整个项目
golangci-lint run ./pkg/...      # 只检查某个子包
golangci-lint run --fix          # 自动修复可修复的问题

在 VS Code 中集成

安装 Go 官方扩展后,在 .vscode/settings.json 中添加:

{
  "go.lintTool": "golangci-lint",
  "go.lintFlags": [
    "--fast"
  ]
}

保存文件时会实时显示 lint 结果。

集成到 CI/CD(GitHub Actions 示例)

在项目根目录创建 .github/workflows/lint.yml

name: Lint
on: [push, pull_request]
jobs:
  golangci:
    name: lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: '1.22'
      - name: golangci-lint
        uses: golangci/golangci-lint-action@v6
        with:
          version: latest
          args: --timeout=5m

每次提交代码时,便自动执行 lint 检查,避免问题代码流入主分支。

推荐启用的核心 linters

对于一个追求高代码质量的 Go 项目,建议至少启用以下 linters:

Linter 作用
errcheck 检查未处理的错误返回值
gosimple 提出更简洁的 Go 代码建议
govet 检测 Go 标准库中 vet 能发现的常见错误
ineffassign 检测已赋值但从未使用的变量
staticcheck 功能强大的静态分析合集,包含大量实用检查
unused 检查未使用的常量、变量、函数等
bodyclose 检查 HTTP 响应体是否关闭
noctx 检查 http.Request 是否遗漏 context
sqlclosecheck 检查 sql.Rowssql.Stmt 是否关闭

启用自动修复

部分 linter 能够自动修复代码问题,可以在提交前运行:

golangci-lint run --fix

请注意,自动修复默认只处理安全、无破坏性的问题(如格式化、未使用变量命名等)。谨慎在 CI 中使用 --fix,通常建议仅在本地使用。

忽略特定问题

有时候必须忽略某些 lint 警告。可以通过注释在代码中临时禁用:

  • 仅忽略下一行
    //nolint:errcheck
    doSomething()
    
  • 忽略整个文件: 在文件开头添加:
    //nolint
    
  • 在配置中永久排除
    issues:
      exclude-rules:
        - path: _test\.go
          linters:
            - gosec
    

常见问题排查

1. 运行超时

如果项目庞大,默认超时可能不够。在配置中增加:

run:
  timeout: 10m

2. 内存占用过高

调整并行数:

run:
  concurrency: 4

3. 提示 go: could not download

确保 GOPROXY 设置正确,可尝试:

export GOPROXY=https://goproxy.io,direct

4. 与 vendor 目录冲突

默认会跳过 vendor 目录,但若未正确跳过,手动添加:

run:
  skip-dirs:
    - vendor

5. 如何查看所有可用 linter

golangci-lint help linters