用途:modern-go 用于把 Go 源码现代化,套用与项目 Go 版本相匹配的惯用法、API 和语言特性,工作方式类似 go fix,并额外包含来自 Go 团队 modernize 分析及社区实践的改写。
主要能力:从 go.mod 的 go 指令检测项目 Go 版本;在目标范围内查找 .go 文件(排除 vendor/、.git/、testdata/);对每个文件按版本从旧到新应用所有适用于「版本 ≤ 项目 Go 版本」的改写;完成后打印改动与跳过项摘要。每项改写都有版本门槛,绝不应用高于项目声明版本的改写。
覆盖的改写示例:time.Since/time.Until;循环拼接改用 strings.Builder;errors.Is;//go:build 约束(移除冗余 // +build);unsafe.Add/unsafe.Slice;interface{} 改 any;strings.Cut/bytes.Cut;fmt.Appendf;类型安全原子操作(atomic.Int32 等);strings.Clone/bytes.Clone;strings.CutPrefix/CutSuffix;errors.Join;context.WithCancelCause;min/max;clear;slices 与 maps 包(Contains、Index、SortFunc、Max/Min、Reverse、Compact、Clip、Clone、Delete、Insert、Equal、Concat、Clone、Copy、DeleteFunc);sync.OnceFunc/OnceValue;context.AfterFunc、WithTimeoutCause/WithDeadlineCause;range over integer;循环变量遮蔽移除;cmp.Or;reflect.TypeFor;增强的 http.ServeMux;math/rand/v2;range over function(iter.Seq);迭代器辅助(slices.Collect(maps.Keys/Values));strings.SplitSeq/FieldsSeq 等。
使用方式:当用户要求现代化 Go 代码时调用该技能。默认现代化整个项目,用户也可指定文件或目录以限定范围。
适用场景:升级既有 Go 项目以采用新版本惯用法、减少手写样板、修复易错模式(如 uintptr 指针运算、切片删除的别名/泄漏隐患、32 位架构上的 64 位对齐崩溃)。
限制:仅应用项目 go.mod 版本允许的改写;部分改写(如 math/rand/v2 迁移、迭代器 API 改造)会改变随机流或 API 形态,应作为建议而非自动应用;slices.Equal/maps.Equal 仅适用于可直接比较的元素类型;slices.Concat 仅用于构建新切片而非原地追加。资料未提供安装命令、收费或平台信息。