跳到主要内容

代码规范与 Lint

问题

Go 项目如何保证代码质量?有哪些 Lint 工具?

答案

内置工具

gofmt -w .         # 格式化(Go 官方格式,无争议)
go vet ./... # 静态分析(检查常见错误)
go test -race ./...# 竞态检测

golangci-lint(推荐)

聚合 100+ 个 Linter:

# .golangci.yml
run:
timeout: 5m

linters:
enable:
- errcheck # 检查未处理的 error
- govet # 内置 vet
- staticcheck # 高级静态分析
- unused # 未使用的代码
- gosimple # 简化建议
- ineffassign # 无效赋值
- misspell # 拼写错误
- gocyclo # 圈复杂度
- bodyclose # HTTP Body 未关闭
- gocritic # 代码审查建议
- revive # golint 替代

linters-settings:
gocyclo:
min-complexity: 15

issues:
exclude-rules:
- path: _test\.go
linters: [errcheck]
golangci-lint run ./...

常见代码规范

规范说明
命名驼峰、包名小写、接口名不加 I
错误处理必须处理 error,不要 _ = err
注释导出的函数/类型必须有注释
包导入标准库 → 第三方 → 内部包,空行分隔
函数长度不超过 80 行,超了就拆

Pre-commit Hook

# 安装 pre-commit
pip install pre-commit
# .pre-commit-config.yaml
repos:
- repo: https://github.com/golangci/golangci-lint
rev: v1.59.0
hooks:
- id: golangci-lint
- repo: https://github.com/dnephin/pre-commit-golang
hooks:
- id: go-fmt
- id: go-vet

常见面试问题

Q1: Go 为什么强制 gofmt?

答案:消除格式争论,统一代码风格。gofmt 是 Go 工具链的一部分,所有 Go 代码格式一致。这让 Code Review 只关注逻辑,不争缩进和括号。

Q2: go vet 能检查什么?

答案

  • fmt.Printf 参数不匹配
  • 结构体 tag 格式错误
  • 未使用的变量
  • 不可达代码
  • sync 类型的复制(如复制 sync.Mutex

相关链接