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

149 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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/`