首页/开发/代码质量与评审速查/go vet:官方静态检查
规范与静态检查65 条

go vet:官方静态检查

go vet 是 Go 官方静态检查:go test 会默认运行一组 vet 检查(printf、atomic、bool、errorsas 等),也可单独执行 go vet ./...。

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 当成全部检查:它只跑了子集,覆盖范围明显小于完整命令。

易错点

  • 把 go test 内置的 vet 当全部检查:覆盖范围其实很有限
  • 把 vet 与 staticcheck 混为一谈:以为官方工具已经覆盖,补强检查被跳过
  • 只在本地偶尔运行:格式化与并发类问题在合并之后才被发现
  • 看到 copylocks 警告后用拷贝结构体的方式绕过:锁的语义随之被破坏
  • 把 vet 警告当成可忽略的提示:atomic 与 copylocks 这类警告背后往往是真实缺陷

数据来源与参考

  • Go 官方文档(go.dev · cmd/go)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌