Go 開發模式
必要工作流程
執行審查時,請一併叫用相關技能: security-audit (OWASP)、enterprise-readiness (OpenSSF/SLSA)、github-project (分支保護)。這些都是必須的。
核心原則
型別安全
- 避免:
interface{}(改用any)、sync.Map、分散的型別斷言、反射 - 偏好: 泛型
[T any]、errors.AsType[T](Go 1.26)、具體型別 - 升級後執行
go fix ./...
一致性
- 每個問題域僅使用一種模式
- 符合現有程式碼庫模式
- 要重構就全面重構,否則完全不做
- 配置優先級:預設值 < 設定檔 < 環境變數 < 命令列標記
測試
- 使用建置標籤隔離測試層級:單元測試 (預設)、
integration、e2e - 一律使用
t.Parallel()、t.Helper()、表格驅動子測試 - 直接使用
log/slog—— 絕對不要為其包裝自訂的 Logger 介面
慣例
- 錯誤訊息:小寫、無標點符號 (
errors.New("invalid input")) - 命名:ID、URL、HTTP (勿用 Id、Url、Http)
- 錯誤包裝:
fmt.Errorf("failed to process: %w", err)
參考資料
Git Hooks:ls lefthook.yml 2>/dev/null && lefthook install || echo "Add lefthook — see references/lefthook-template.md"
視需要載入:
| 參考文件 | 用途 |
|---|---|
references/architecture.md | 套件結構、配置管理、中介軟體鏈 |
references/logging.md | 使用 log/slog 的結構化日誌、從 logrus 遷移 |
references/cron-scheduling.md | go-cron 模式:具名任務、執行時期更新、Context、韌性 |
references/resilience.md | 重試邏輯、優雅關機、Context 傳遞 |
references/docker.md | Docker 客戶端模式、緩衝池 |
references/ldap.md | LDAP/Active Directory 整合 |
references/testing.md | 測試策略、建置標籤、表格驅動測試 |
references/linting.md | golangci-lint v2、staticcheck、程式碼品質 |
references/api-design.md | Bitmask 選項、函數式選項、建構者模式 |
references/fuzz-testing.md | Go Fuzzing 模式、安全性種子 |
references/contracts-and-invariants.md | 合約、不變量、屬性測試 |
references/mutation-testing.md | Gremlins 設定、測試品質衡量 |
references/makefile.md | 標準 Makefile 介面,適用於 CI/CD |
references/modernization.md | Go 1.26 現代化工具、go fix、errors.AsType[T]、wg.Go() |
references/lefthook-template.md | 立即可用的 Go 專案 Git Hooks 設定檔 lefthook.yml |
references/reusable-workflows.md | 可重複使用的 Actions Workflow 呼叫者、權限傳遞、發佈閘道輸出 |
references/single-build-release.md | 單一建置發佈:一次交叉編譯,重複用於發佈與容器 |
references/awesome-go-submission.md | awesome-go 提交:CI 解析的 PR 正文、條目格式、名稱衝突處理 |
品質關卡
在完成任何審查前執行:
golangci-lint run --timeout 5m # Linting
go vet ./... # 靜態分析
staticcheck ./... # 額外檢查
govulncheck ./... # 漏洞掃描
go test -race ./... # 競賽檢測
標準函式庫漏洞修復
當 govulncheck 報告標準函式庫漏洞時:透過 vuln.go.dev 檢查修復版本、更新 go.mod 中的 go X.Y.Z、執行 go mod tidy。對於設有分支保護的儲存庫,請使用 PR 分支。
貢獻方式: 將改善提交至 https://github.com/netresearch/go-development-skill