將 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.As、strings.Cut)仍被納入,因為它們仍然常被遺漏;但許多 1.21 之前的改進則刻意省略,因為它們早已該被採用,現在應視為 Go 的基本實務。
如果開發者正在處理其他任務,你絕對不能進行大規模重構。但請試著說服你的使用者這會提升程式碼品質。
同意確認(僅限情境觸發): 當此技能在開發者處理其他事情時觸發(非明確的 /golang-modernize 呼叫),請詢問一次:「我注意到一些現代化的機會——你想要我提出建議,還是先跳過?」如果使用者說跳過(或任何等效說法),立即停止,並且在本次工作階段中不再套用或提及任何現代化。不要在當前工作階段中再次詢問。
工作流程
當被呼叫時:
- 檢查專案的
go.mod或go.work以確定目前的 Go 版本(go指令) - 使用下方 Go 版本變更日誌表檢查最新的 Go 版本,如果專案的
go.mod落後,建議升級 - 讀取專案根目錄的
.modernize——此檔案包含先前忽略的建議;不要再次建議其中列出的任何項目 - 掃描程式碼庫以尋找基於目標 Go 版本的現代化機會
- 執行
golangci-lint,如果可用,啟用modernizelinter - 根據情境提出改進建議:
- 如果開發者正在積極編碼,僅建議與他們當前正在處理的程式碼相關的改進。不要重構無關的檔案。相反地,提及你注意到的機會,並解釋為什麼這項變更會有益——但讓開發者決定。
- 如果透過
/golang-modernize或 CI 明確呼叫,則掃描並建議整個程式碼庫的改進。
- 對於大型程式碼庫,使用最多 5 個子代理(透過 Agent 工具)平行掃描,每個代理針對不同的現代化類別(例如已棄用套件、語言特性、標準函式庫升級、測試模式、工具與基礎設施)
- 在建議依賴項更新之前,執行
go mod tidy與測試套件以驗證相容性。請開發者在繼續之前先檢視依賴項的變更日誌與發行說明,以了解重大變更。 - 如果開發者明確忽略某個建議,在專案根目錄的
.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/modernize;gopls 與 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.SliceHeader、StringHeader |
unsafe.Slice、unsafe.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.NewOFB、NewCFB* |
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 |
遷移優先級指南
在現代化程式碼庫時,依影響程度排序變更:
高優先級(安全性與正確性)
- 移除迴圈變數陰影複製 (Go 1.22+) — 防止細微錯誤
- 將
math/rand替換為math/rand/v2(Go 1.22+) — 移除rand.Seed呼叫 - 對使用者提供的檔案路徑使用
os.Root(Go 1.24+) — 防止路徑遍歷 - 執行
govulncheck(Go 1.22+) — 捕捉已知漏洞 - 使用
errors.Is/errors.As取代直接比較 (Go 1.13+) - 遷移已棄用的加密套件 (Go 1.24+) — 安全性關鍵
中優先級(可讀性與可維護性)
- 將
interface{}替換為any(Go 1.18+) - 使用
min/max內建函式 (Go 1.21+) - 對整數使用
range(Go 1.22+) - 使用
slices與maps套件 (Go 1.21+) - 使用
cmp.Or處理預設值 (Go 1.22+) - 使用
sync.OnceValue/sync.OnceFunc(Go 1.21+) - 使用
sync.WaitGroup.Go(Go 1.25+) - 在測試中使用
t.Context()(Go 1.24+) - 在基準測試中使用
b.Loop()(Go 1.24+)
較低優先級(漸進式改進)
- 從第三方日誌器遷移至
slog(Go 1.21+) - 在能簡化程式碼的地方採用迭代器 (Go 1.23+)
- 將
sort.Slice替換為slices.SortFunc(Go 1.21+) - 使用
strings.SplitSeq與迭代器變體 (Go 1.24+) - 將工具依賴項移至
go.mod的 tool 指令 (Go 1.24+) - 為正式環境建置啟用 PGO (Go 1.21+)
- 升級至 golangci-lint v2 並啟用 modernize linter (golangci-lint v2.6.0+)
- 在 CI 管線中加入
govulncheck - 設定每月現代化 CI 管線
- 僅在專案明確選擇
GOEXPERIMENT=jsonv2時評估encoding/json/v2(Go 1.25+,實驗性) - 在 CI 中設定 AI 驅動的程式碼審查——載入這些技能以引導各領域的審查;請參閱
samber/cc-skills-golang@golang-continuous-integration
相關技能
請參閱 samber/cc-skills-golang@golang-concurrency、samber/cc-skills-golang@golang-testing、samber/cc-skills-golang@golang-observability、samber/cc-skills-golang@golang-error-handling、samber/cc-skills-golang@golang-lint、samber/cc-skills-golang@golang-continuous-integration 技能。






