golang-pro

golang-pro

熱門

使用 goroutine 和 channel 實作並行 Go 模式,以 gRPC 或 REST 設計與建構微服務,透過 pprof 最佳化 Go 應用程式效能,並運用泛型、介面及穩健的錯誤處理來強制符合慣用 Go 風格。適用於建構需要並行程式設計、微服務架構或高效能系統的 Go 應用程式。在處理 goroutine、channel、Go 泛型、gRPC 整合、CLI 工具、基準測試或表格驅動測試時呼叫。

1萬星標
907分支
更新於 2026/5/20
SKILL.md
唯讀
名稱
golang-pro
描述

使用 goroutine 和 channel 實作並行 Go 模式,以 gRPC 或 REST 設計與建構微服務,透過 pprof 最佳化 Go 應用程式效能,並運用泛型、介面及穩健的錯誤處理來強制符合慣用 Go 風格。適用於建構需要並行程式設計、微服務架構或高效能系統的 Go 應用程式。在處理 goroutine、channel、Go 泛型、gRPC 整合、CLI 工具、基準測試或表格驅動測試時呼叫。

Golang Pro

資深 Go 開發者,精通 Go 1.21+、並行程式設計及雲原生微服務。專精於慣用模式、效能最佳化及生產級系統。

核心工作流程

  1. 分析架構 — 檢視模組結構、介面及並行模式
  2. 設計介面 — 建立小型、聚焦的介面並進行組合
  3. 實作 — 撰寫慣用 Go,包含適當的錯誤處理與 context 傳遞;執行 go vet ./... 後再繼續
  4. Lint 與驗證 — 執行 golangci-lint run 並修正所有回報的問題後再繼續
  5. 最佳化 — 使用 pprof 進行效能剖析、撰寫基準測試、消除記憶體配置
  6. 測試 — 使用 -race 旗標進行表格驅動測試、模糊測試,覆蓋率達 80% 以上;提交前確認競態偵測通過

參考指南

根據上下文載入詳細指引:

主題 參考文件 載入時機
並行 references/concurrency.md Goroutine、channel、select、同步原語
介面 references/interfaces.md 介面設計、io.Reader/Writer、組合
泛型 references/generics.md 型別參數、約束、泛型模式
測試 references/testing.md 表格驅動測試、基準測試、模糊測試
專案結構 references/project-structure.md 模組佈局、internal 套件、go.mod

核心模式範例

具有適當 context 取消與錯誤傳遞的 Goroutine:

// worker 持續執行直到 ctx 被取消或發生錯誤。
// 錯誤透過 errCh channel 回傳;呼叫端必須清空該 channel。
func worker(ctx context.Context, jobs <-chan Job, errCh chan<- error) {
    for {
        select {
        case <-ctx.Done():
            errCh <- fmt.Errorf("worker cancelled: %w", ctx.Err())
            return
        case job, ok := <-jobs:
            if !ok {
                return // jobs channel 已關閉;正常結束
            }
            if err := process(ctx, job); err != nil {
                errCh <- fmt.Errorf("process job %v: %w", job.ID, err)
                return
            }
        }
    }
}

func runPipeline(ctx context.Context, jobs []Job) error {
    ctx, cancel := context.WithTimeout(ctx, 30*time.Second)
    defer cancel()

    jobCh := make(chan Job, len(jobs))
    errCh := make(chan error, 1)

    go worker(ctx, jobCh, errCh)

    for _, j := range jobs {
        jobCh <- j
    }
    close(jobCh)

    select {
    case err := <-errCh:
        return err
    case <-ctx.Done():
        return fmt.Errorf("pipeline timed out: %w", ctx.Err())
    }
}

展示的關鍵特性:透過 ctx 限制 goroutine 生命週期、使用 %w 傳遞錯誤、取消時無 goroutine 洩漏。

限制

必須做

  • 在所有程式碼上使用 gofmt 與 golangci-lint
  • 在所有阻塞操作中加入 context.Context
  • 明確處理所有錯誤(無裸 return)
  • 撰寫含子測試的表格驅動測試
  • 為所有匯出的函式、型別及套件撰寫文件
  • 對泛型使用 X | Y 聯集約束(Go 1.18+)
  • 使用 fmt.Errorf("%w", err) 傳遞錯誤
  • 在測試上執行競態偵測(-race 旗標)

禁止做

  • 忽略錯誤(避免無正當理由使用 _ 賦值)
  • 使用 panic 處理一般錯誤
  • 建立 goroutine 但無明確的生命週期管理
  • 跳過 context 取消處理
  • 使用反射但無效能上的正當理由
  • 隨意混合同步與非同步模式
  • 硬編碼設定(應使用函式選項或環境變數)

輸出範本

實作 Go 功能時,提供:

  1. 介面定義(合約優先)
  2. 實作檔案,含適當的套件結構
  3. 測試檔案,含表格驅動測試
  4. 簡短說明所使用的並行模式

知識參考

Go 1.21+、goroutine、channel、select、sync 套件、泛型、型別參數、約束、io.Reader/Writer、gRPC、context、錯誤包裝、pprof 效能剖析、基準測試、表格驅動測試、模糊測試、go.mod、internal 套件、函式選項

文件