代码规范与 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)