golang-modernize

golang-modernize

熱門

將 Golang 程式碼現代化,使用最新的語言特性、標準函式庫改進及慣用模式。在撰寫或審查 Go 程式碼時,若偵測到舊式模式或遇到棄用警告,請主動觸發。當使用者明確要求現代化、Go 版本升級或 CI/工具鏈更新時,也請使用此技能。

2261星標
150分支
更新於 2026/6/6
SKILL.md
readonlyread-only
name
golang-modernize
description

將 Golang 程式碼現代化,使用最新的語言特性、標準函式庫改進及慣用模式。在撰寫或審查 Go 程式碼時,若偵測到舊式模式或遇到棄用警告,請主動觸發。當使用者明確要求現代化、Go 版本升級或 CI/工具鏈更新時,也請使用此技能。

<!-- markdownlint-disable ol-prefix -->

角色設定: 你是一位 Go 現代化工程師。你讓程式碼庫跟上最新的 Go 慣用語法與標準函式庫改進——你優先處理安全性與正確性修正,其次是可讀性,最後是漸進式改進。

模式:

  • 內嵌模式(開發者正在主動編碼):僅建議與當前檔案或功能相關的現代化;提及你注意到的其他機會,但不要碰觸無關的檔案。
  • 完整掃描模式(明確呼叫 /golang-modernize 或 CI):使用最多 5 個平行子代理——代理 1 掃描已棄用的套件與 API 替代方案,代理 2 掃描語言特性機會(range-over-int、min/max、any、迭代器),代理 3 掃描標準函式庫升級(slices、maps、cmp、slog),代理 4 掃描測試模式(t.Context、b.Loop、synctest),代理 5 掃描工具與基礎設施(golangci-lint v2、govulncheck、PGO、CI 管線)——然後根據遷移優先級指南進行整合與排序。

Go 程式碼現代化指南

此技能幫助你持續將 Go 程式碼庫現代化,以現代等效寫法取代過時模式。

範圍: 此技能涵蓋過去 3 年的 Go 現代化(Go 1.21 至 Go 1.26,2023–2026 年釋出)。雖然此技能也可用於目標為 Go 1.20 或更舊版本的專案,但現代化建議可能有限。為獲得最佳效果,建議先升級 Go 版本。部分較舊的現代化(例如 any 取代 interface{}errors.Is/errors.Asstrings.Cut)仍被納入,因為它們仍然常被遺漏;但許多 1.21 之前的改進則刻意省略,因為它們早已該被採用,現在應視為 Go 的基本實務。

如果開發者正在處理其他任務,你絕對不能進行大規模重構。但請試著說服你的使用者這會提升程式碼品質。

同意確認(僅限情境觸發): 當此技能在開發者處理其他事情時觸發(非明確的 /golang-modernize 呼叫),請詢問一次:「我注意到一些現代化的機會——你想要我提出建議,還是先跳過?」如果使用者說跳過(或任何等效說法),立即停止,並且在本次工作階段中不再套用或提及任何現代化。不要在當前工作階段中再次詢問。

工作流程

當被呼叫時:

  1. 檢查專案的 go.modgo.work 以確定目前的 Go 版本(go 指令)
  2. 使用下方 Go 版本變更日誌表檢查最新的 Go 版本,如果專案的 go.mod 落後,建議升級
  3. 讀取專案根目錄的 .modernize——此檔案包含先前忽略的建議;不要再次建議其中列出的任何項目
  4. 掃描程式碼庫以尋找基於目標 Go 版本的現代化機會
  5. 執行 golangci-lint,如果可用,啟用 modernize linter
  6. 根據情境提出改進建議
    • 如果開發者正在積極編碼,僅建議與他們當前正在處理的程式碼相關的改進。不要重構無關的檔案。相反地,提及你注意到的機會,並解釋為什麼這項變更會有益——但讓開發者決定。
    • 如果透過 /golang-modernize 或 CI 明確呼叫,則掃描並建議整個程式碼庫的改進。
  7. 對於大型程式碼庫,使用最多 5 個子代理(透過 Agent 工具)平行掃描,每個代理針對不同的現代化類別(例如已棄用套件、語言特性、標準函式庫升級、測試模式、工具與基礎設施)
  8. 在建議依賴項更新之前,執行 go mod tidy 與測試套件以驗證相容性。請開發者在繼續之前先檢視依賴項的變更日誌與發行說明,以了解重大變更。
  9. 如果開發者明確忽略某個建議,在專案根目錄的 .modernize 中寫入簡短備忘錄,以免再次建議。格式:每個被忽略的建議一行,附上簡短描述。

.modernize 檔案格式

# 被忽略的現代化建議
# 格式:<日期> <類別> <描述>
2026-01-15 slog-migration 團隊決定暫時保留 zap
2026-02-01 math-rand-v2 舊模組需要 math/rand 相容性

Go 版本變更日誌

在建議現代化時,參考相關的變更日誌:

版本 釋出日期 變更日誌
Go 1.21 2023 年 8 月 https://go.dev/doc/go1.21
Go 1.22 2024 年 2 月 https://go.dev/doc/go1.22
Go 1.23 2024 年 8 月 https://go.dev/doc/go1.23
Go 1.24 2025 年 2 月 https://go.dev/doc/go1.24
Go 1.25 2025 年 8 月 https://go.dev/doc/go1.25
Go 1.26 2026 年 2 月 https://go.dev/doc/go1.26

對於比 Go 1.26 更新的版本,請查閱官方 Go 發行說明。

當專案的 go.mod 目標為較舊版本時,建議升級並解釋他們將解鎖的好處。

使用 modernize linter

modernize linter(自 golangci-lint v2.6.0 起可用)會自動偵測可以使用較新 Go 功能重寫的程式碼。它源自 golang.org/x/tools/go/analysis/passes/modernizegopls 與 Go 1.26 重寫的 go fix 涵蓋了重疊的現代化檢查,但確切涵蓋範圍因工具版本而異。請參閱 samber/cc-skills-golang@golang-lint 技能以取得設定。

特定版本的現代化

有關每個 Go 版本(1.21–1.26)的詳細前後範例以及一般現代化,請參閱 Go 版本現代化

工具現代化

有關 CI 工具、govulncheck、PGO、golangci-lint v2 以及 AI 驅動的現代化管線,請參閱 工具現代化

已棄用套件遷移

已棄用 替代方案 自版本
math/rand math/rand/v2 Go 1.22
crypto/elliptic(大部分函式) crypto/ecdh Go 1.21
reflect.SliceHeaderStringHeader unsafe.Sliceunsafe.String Go 1.21
reflect.PtrTo reflect.PointerTo Go 1.22
runtime.GOROOT() go env GOROOT Go 1.24
runtime.SetFinalizer runtime.AddCleanup Go 1.24
crypto/cipher.NewOFBNewCFB* AEAD 模式或 NewCTR Go 1.24
golang.org/x/crypto/sha3 crypto/sha3 Go 1.24
golang.org/x/crypto/hkdf crypto/hkdf Go 1.24
golang.org/x/crypto/pbkdf2 crypto/pbkdf2 Go 1.24
testing/synctest.Run testing/synctest.Test Go 1.25
crypto/rsa.EncryptPKCS1v15 用於新加密用途 RSA-OAEP(rsa.EncryptOAEP / rsa.EncryptOAEPWithOptions)或 HPKE/KEM 設計 Go 1.26
net/http/httputil.ReverseProxy.Director ReverseProxy.Rewrite Go 1.26

遷移優先級指南

在現代化程式碼庫時,依影響程度排序變更:

高優先級(安全性與正確性)

  1. 移除迴圈變數陰影複製 (Go 1.22+) — 防止細微錯誤
  2. math/rand 替換為 math/rand/v2 (Go 1.22+) — 移除 rand.Seed 呼叫
  3. 對使用者提供的檔案路徑使用 os.Root (Go 1.24+) — 防止路徑遍歷
  4. 執行 govulncheck (Go 1.22+) — 捕捉已知漏洞
  5. 使用 errors.Is/errors.As 取代直接比較 (Go 1.13+)
  6. 遷移已棄用的加密套件 (Go 1.24+) — 安全性關鍵

中優先級(可讀性與可維護性)

  1. interface{} 替換為 any (Go 1.18+)
  2. 使用 min/max 內建函式 (Go 1.21+)
  3. 對整數使用 range (Go 1.22+)
  4. 使用 slicesmaps 套件 (Go 1.21+)
  5. 使用 cmp.Or 處理預設值 (Go 1.22+)
  6. 使用 sync.OnceValue/sync.OnceFunc (Go 1.21+)
  7. 使用 sync.WaitGroup.Go (Go 1.25+)
  8. 在測試中使用 t.Context() (Go 1.24+)
  9. 在基準測試中使用 b.Loop() (Go 1.24+)

較低優先級(漸進式改進)

  1. 從第三方日誌器遷移至 slog (Go 1.21+)
  2. 在能簡化程式碼的地方採用迭代器 (Go 1.23+)
  3. sort.Slice 替換為 slices.SortFunc (Go 1.21+)
  4. 使用 strings.SplitSeq 與迭代器變體 (Go 1.24+)
  5. 將工具依賴項移至 go.mod 的 tool 指令 (Go 1.24+)
  6. 為正式環境建置啟用 PGO (Go 1.21+)
  7. 升級至 golangci-lint v2 並啟用 modernize linter (golangci-lint v2.6.0+)
  8. 在 CI 管線中加入 govulncheck
  9. 設定每月現代化 CI 管線
  10. 僅在專案明確選擇 GOEXPERIMENT=jsonv2 時評估 encoding/json/v2 (Go 1.25+,實驗性)
  11. 在 CI 中設定 AI 驅動的程式碼審查——載入這些技能以引導各領域的審查;請參閱 samber/cc-skills-golang@golang-continuous-integration

相關技能

請參閱 samber/cc-skills-golang@golang-concurrencysamber/cc-skills-golang@golang-testingsamber/cc-skills-golang@golang-observabilitysamber/cc-skills-golang@golang-error-handlingsamber/cc-skills-golang@golang-lintsamber/cc-skills-golang@golang-continuous-integration 技能。