claude-code/claude-zh/commands/go-review.md

149 lines
3.8 KiB
Markdown
Raw Permalink Normal View History

2026-02-27 13:45:37 +00:00
---
description: 對 Go 程式碼進行全面的審查,包含慣用法、並發安全、錯誤處理與安全性。此指令會呼叫 go-reviewer agent。
---
# Go 程式碼審查 (Go Code Review)
此指令會呼叫 **go-reviewer** agent 來進行針對 Go 語言特性的全面審查。
## 此指令的功能
1. **識別 Go 變更**:透過 `git diff` 找出修改過的 `.go` 檔案。
2. **執行靜態分析**:執行 `go vet`, `staticcheck``golangci-lint`
3. **安全掃描**:檢查是否存在 SQL 注入、指令注入、競態條件 (Race conditions)。
4. **並發審查 (Concurrency Review)**:分析 Goroutine 安全性、Channel 使用方式、Mutex 模式。
5. **慣用法檢查 (Idiomatic Go Check)**:驗證程式碼是否遵循 Go 慣例與最佳實踐。
6. **產生報告**:按嚴重程度對問題進行分類。
## 何時使用
在以下情況使用 `/go-review`
- 撰寫或修改 Go 程式碼後。
- 提交 Go 變更前。
- 審查包含 Go 程式碼的 Pull Request 時。
- 進入新的 Go 專案庫時。
- 學習 Go 慣用模式時。
## 審查類別
### 關鍵問題 (CRITICAL - 必須修復)
- SQL/指令注入漏洞。
- 無同步機制的競態條件。
- Goroutine 洩漏 (Leaks)。
- 硬編碼的憑據。
- 不安全的指標 (Unsafe pointer) 使用。
- 在關鍵路徑中忽略錯誤 (Ignored errors)。
### 高優先級 (HIGH - 建議修復)
- 缺少帶有上下文 (Context) 的錯誤包裝。
- 使用 Panic 代替返回錯誤。
- Context 未進行傳播。
- 無緩衝 Channel 導致死結 (Deadlocks)。
- 介面未滿足 (Interface not satisfied) 錯誤。
- 缺少 Mutex 保護。
### 中優先級 (MEDIUM - 考慮調整)
- 非慣用性的程式碼模式。
- 公共匯出項目缺少 Godoc 註釋。
- 低效的字串拼接。
- Slice 未預先分配空間。
- 未使用表格驅動測試 (Table-driven tests)。
## 執行的自動化檢查
```bash
# 靜態分析
go vet ./...
# 進階檢查 (如果已安裝)
staticcheck ./...
golangci-lint run
# 競態偵測
go build -race ./...
# 安全漏洞掃描
govulncheck ./...
```
## 使用範例
```text
使用者:/go-review
Agent
# Go 程式碼審查報告
## 審查檔案
- internal/handler/user.go (已修改)
- internal/service/auth.go (已修改)
## 靜態分析結果
✓ go vet: 無問題
✓ staticcheck: 無問題
## 發現問題
[CRITICAL] 競態條件 (Race Condition)
檔案: internal/service/auth.go:45
問題: 在無同步機制的情況下訪問共享 Map
```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]
}
```
[HIGH] 缺少錯誤上下文 (Missing Error Context)
檔案: internal/handler/user.go:28
問題: 返回錯誤時未附帶上下文資訊
```go
return err // 缺少上下文
```
修復方案: 使用文字或包裝來提供上下文
```go
return fmt.Errorf("get user %s: %w", userID, err)
```
## 摘要
- CRITICAL: 1
- HIGH: 1
- MEDIUM: 0
建議: ❌ 在修復 CRITICAL 問題前,禁止合併 (Block merge)
```
## 核准標準
| 狀態 | 條件 |
|--------|-----------|
| ✅ 核准 (Approve) | 無 CRITICAL 或 HIGH 問題 |
| ⚠️ 警告 (Warning) | 僅存在 MEDIUM 問題 (謹慎合併) |
| ❌ 阻斷 (Block) | 發現 CRITICAL 或 HIGH 問題 |
## 與其他指令的整合
- 先使用 `/go-test` 確保測試通過。
- 如果發生建置錯誤,請使用 `/go-build`
- 在提交前使用 `/go-review`
- 對於非 Go 特有的通用問題,請使用 `/code-review`
## 相關參考
- Agent: `agents/go-reviewer.md`
- 技能: `skills/golang-patterns/`, `skills/golang-testing/`