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