Go代码格式化与静态分析工具
Go内置代码质量工具,统一格式化风格,静态分析潜在问题。
gofmt格式化工具
基本使用
Bash
# 格式化单个文件
gofmt main.go
# 格式化并写入文件
gofmt -w main.go
# 格式化目录
gofmt -w ./src
# 格式化并显示差异
gofmt -d main.go
# 简化代码
gofmt -s main.go
格式化规则
Go
// gofmt统一格式:
// 1. 缩进使用Tab
// 2. 左大括号不换行
// 3. 标准空格规则
// 4. 一致的命名风格
// 格式化前
if x>0{
fmt.Println( x )
}
// 格式化后
if x > 0 {
fmt.Println(x)
}
gofmt强制统一风格,消除团队争议。
gofmt -s简化
Go
// 简化slice声明
// 格式化前
var s = []int{1, 2, 3}
// 格式化后(更简洁)
s := []int{1, 2, 3}
// 简化结构体初始化
// 格式化前
var u = User{Name: "Tom", Age: 25}
// 格式化后
u := User{Name: "Tom", Age: 25}
go vet静态分析
基本使用
Bash
# 检查单个文件
go vet main.go
# 检查包
go vet ./...
# 检查整个项目
go vet ./src
# 查看帮助
go vet help
常见检查项
Go
// 1. Printf格式字符串错误
fmt.Printf("%d", "string") // 类型不匹配
// go vet检测:wrong type for argument
// 2. 未使用的变量
func example() {
unused := 10 // 未使用
}
// 3. 错误的结构体标签
type User struct {
Name string `json:"name,omitempty,extra"` // 无效标签
}
// 4. 死锁的channel
func deadlock() {
ch := make(chan int)
ch <- 1 // 无接收者,死锁
}
// 5. 错误的原子操作
var x int64
x = atomic.AddInt64(&x, 1) // AddInt64不返回新值
// 6. 无效的锁复制
var mu sync.Mutex
mu2 := mu // 锁不能复制!
go vet检查表
| 检查项 | 说明 |
|---|---|
| printf | 格式字符串与参数匹配 |
| composite | 结构体字面量类型检查 |
| copylocks | 锁复制检测 |
| atomic | 原子操作使用错误 |
| unreachable | 不可达代码检测 |
| shadow | 变量遮蔽检测 |
| unused | 未使用代码检测 |
集成到开发流程
编辑器集成
Bash
# VS Code配置
# 设置保存时格式化
"go.formatTool": "gofmt"
"go.lintOnSave": "workspace"
# GoLand配置
# Settings → Tools → File Watchers
# 添加gofmt和go vet
CI集成
YAML
# GitHub Actions示例
steps:
- name: Format check
run: test -z $(gofmt -l .)
- name: Vet check
run: go vet ./...
Makefile集成
makefile
.PHONY: fmt vet
fmt:
gofmt -w .
vet:
go vet ./...
lint: fmt vet
第三方lint工具
golangci-lint
Bash
# 安装
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
# 运行
golangci-lint run
# 指定文件
golangci-lint run ./src
golangci-lint集成了多种lint工具,功能更全面。
配置文件
YAML
# .golangci.yml
linters:
enable:
- gofmt
- govet
- errcheck
- staticcheck
- unused
linters-settings:
govet:
check-shadowing: true
工具对比
| 工具 | 用途 | 内置 |
|---|---|---|
| gofmt | 格式化 | ✓ |
| go vet | 静态分析 | ✓ |
| golangci-lint | 全面lint | ✗ |
要点总结
- gofmt强制统一代码格式,消除风格争议
- go vet检测常见代码错误
- go vet检查Printf、锁复制、原子操作等
- gofmt -w直接写入格式化结果
- go vet ./...检查整个项目
- 编辑器保存时自动格式化
- CI流程中检查代码质量
- golangci-lint提供更全面的检查
📝 发现内容有误?点击此处直接编辑