---
description: 全面的Go代码审查，涵盖惯用模式、并发安全性、错误处理和安全性。调用go-reviewer代理。
---

# Go 代码审查

此命令调用 **go-reviewer** 代理进行全面的 Go 语言特定代码审查。

## 此命令的作用

1. **识别 Go 变更**：通过 `git diff` 查找修改过的 `.go` 文件
2. **运行静态分析**：执行 `go vet`、`staticcheck` 和 `golangci-lint`
3. **安全扫描**：检查 SQL 注入、命令注入、竞态条件
4. **并发性审查**：分析 goroutine 安全性、通道使用、互斥锁模式
5. **惯用 Go 检查**：验证代码是否遵循 Go 约定和最佳实践
6. **生成报告**：按严重程度分类问题

## 使用时机

在以下情况使用 `/go-review`：

* 编写或修改 Go 代码之后
* 提交 Go 变更之前
* 审查包含 Go 代码的拉取请求时
* 接手新的 Go 代码库时
* 学习惯用 Go 模式时

## 审查类别

### 严重（必须修复）

* SQL/命令注入漏洞
* 无同步的竞态条件
* Goroutine 泄漏
* 硬编码凭证
* 不安全的指针使用
* 关键路径中忽略的错误

### 高（应该修复）

* 缺少带上下文的错误包装
* 使用 panic 而非返回错误
* 上下文未传播
* 无缓冲通道导致死锁
* 接口未满足错误
* 缺少互斥锁保护

### 中（考虑修复）

* 非惯用代码模式
* 导出项缺少 godoc 注释
* 低效的字符串拼接
* 切片未预分配
* 未使用表格驱动测试

## 运行的自动化检查

```bash
# Static analysis
go vet ./...

# Advanced checks (if installed)
staticcheck ./...
golangci-lint run

# Race detection
go build -race ./...

# Security vulnerabilities
govulncheck ./...
```

## 使用示例

````text
# Go 代码审查报告

## 已审查文件
- internal/handler/user.go（已修改）
- internal/service/auth.go（已修改）

## 静态分析结果
✓ go vet: 无问题
✓ staticcheck: 无问题

## 发现的问题

[严重] 竞态条件
文件: internal/service/auth.go:45
问题: 共享映射访问未同步
```go
var cache = map[string]*Session{}  // 并发访问！

func GetSession(id string) *Session {
    return cache[id]  // 竞态条件
}
````

修复：使用 sync.RWMutex 或 sync.Map

```go
var (
    cache   = map[string]*Session{}
    cacheMu sync.RWMutex
)

func GetSession(id string) *Session {
    cacheMu.RLock()
    defer cacheMu.RUnlock()
    return cache[id]
}
```

\[高] 缺少错误上下文
文件：internal/handler/user.go:28
问题：返回的错误缺少上下文

```go
return err  // No context
```

修复：使用上下文包装

```go
return fmt.Errorf("get user %s: %w", userID, err)
```

## 摘要

* 严重：1
* 高：1
* 中：0

建议：❌ 在严重问题修复前阻止合并

```
## 批准标准

| 状态 | 条件 |
|--------|-----------|
| ✅ 批准 | 无 CRITICAL 或 HIGH 级别问题 |
| ⚠️ 警告 | 仅有 MEDIUM 级别问题 (谨慎合并) |
| ❌ 阻止 | 发现 CRITICAL 或 HIGH 级别问题 |

## 与其他命令的集成

- 首先使用 `/go-test` 确保测试通过
- 如果出现构建错误，请使用 `/go-build`
- 提交前使用 `/go-review`
- 对于非 Go 语言特定问题，请使用 `/code-review`

## 相关

- Agent: `agents/go-reviewer.md`
- Skills: `skills/golang-patterns/`, `skills/golang-testing/`
```
