go vet 是什么
go vet 是 Go 官方的静态检查工具:go test 在运行测试前会默认执行其中一个子集,也可以单独执行 go vet ./...。它关注的是几乎确定有问题的写法,比如格式化串与参数不匹配、原子操作被误用、可疑的布尔比较以及结构体值拷贝到锁的问题。
基本信息
| 内置行为 | go test 默认运行 vet 的一个子集 |
|---|---|
| 独立命令 | go vet ./... |
| 典型检查 | printf 格式化串、atomic 误用、可疑 bool 比较、copylocks |
| 定位 | 官方工具,零额外依赖 |
典型使用场景
- 提交前自查:一条命令覆盖多类高频低级错误
- CI 第一步:紧跟编译执行,反馈很快
- 排查格式化输出:printf 类检查能直接指出参数不匹配
- 并发代码检查:原子操作与锁的一部分误用能被识别
- 与更深的检查配合:vet 覆盖不到的部分交给 staticcheck
go vet 覆盖不到的部分
- 错误返回值未处理,需要 errcheck 这类检查
- 未使用的变量与导入,由编译器与其它检查负责
- 风格与简化建议,属于 staticcheck 的范围
- 代码格式,交给 gofmt
用法
用法
go vet ./... # 检查全部包
go vet ./pkg/order/ # 只检查某个目录
go test ./... # 运行测试前会执行内置的 vet 子集
# 需要更深的检查时再引入 staticcheck 或 golangci-lint典型检查与含义
| 检查 | 发现的问题 |
|---|---|
| printf | 格式化串与参数类型或数量不匹配 |
| atomic | 原子操作被误用,例如直接赋值而不是调用方法 |
| bool | 可疑的布尔比较,通常是逻辑写错了 |
| copylocks | 值拷贝时复制了包含锁的结构体 |
官方且零成本:放进 CI 的第一步,比等线上暴露后再排查要省得多。
在评审中的用法:把 go vet 放在流水线靠前的位置,作者提交前也跑一遍;评审者因此可以假设这类低级问题已经被拦住。
printf 类检查的价值在于确定性:格式化串与参数不匹配几乎是必然的错误,不需要在评审里讨论取舍。
把 go test 内置的 vet 当成全部检查:它只跑了子集,覆盖范围明显小于完整命令。