当使用AI帮助编辑代码的时候,AI编写永远达不到预期,以及和自己想法不一致,这个时候就要根据 Go 生态编写 Skill ,所以我把编写 Skill 的流程重构为“四步法”:
第一步:挖掘“Go 项目特有的痛点”(定义边界)
作为 Go 程序员,你要写的 Skill 不是为了“写诗”,而是为了约束 AI 别写出烂代码。所以开工前,先问自己 3 个问题:
AI 最容易在 Go 里犯什么错?(答案:吞掉
err、滥用interface{}、不处理 Context 超时、在循环里拼接字符串)项目的“死穴”在哪?(比如你们的
car项目,死穴是订单状态机和 Nacos 服务发现)团队 Code Review 最常骂哪句话?(比如“不准在
Common里写业务代码”)
对应你的
code-guard:你写的“不吞错误”、“订单状态机不准跳”、“跨服务必须 gRPC”,正是你们团队 Code Review 时的核心痛点。把 CR 清单变成 Skill 规则,就是 Go 程序员写 Skill 的第一性原理。
第二步:搭建符合 Go 工程美学的 Skill 目录
Go 讲究“简洁”和“组合”。Skill 的目录同样要遵循职责单一原则。
不要把所有东西塞进一个SKILL.md(否则就像main.go里写一万行)。按照渐进式披露,标准骨架应该是:
text
my-go-skill/ # 你的技能包 ├── SKILL.md # ⭐ 核心:只放"行为指令"和"铁律"(像 Go 的接口定义) ├── references/ # 📚 按需加载的"百科全书"(像 Go 的 pkg 文档) │ ├── project-arch.md # 存放你的微服务架构图、目录树 │ └── proto-definitions.md # 存放 proto 依赖关系 └── scripts/ # 🛠️ 可执行脚本(像 Go 的 cmd 工具) ├── lint-check.sh # 一键跑 go vet + gofmt └── proto-gen.sh # 一键生成 pb.go
第三步:编写SKILL.md—— 套用“Go 三板斧”模板
把你刚才写的内容抽象一下,以后写任何 Go Skill 都可以直接套用这个Go 专属模板:
1. 元数据(YAML)—— 定好触发“路由”
yaml
--- name: 技能英文名(小写+连字符) description: 包含【技术栈】+【触发词】+【产出物】。例如:"约束 Go+grpc 项目代码规范,用户说写代码/修bug时触发" allowed-tools: Read, Grep, Bash(go:*, gofmt:*)
2. 核心铁律(把Effective Go翻译成 AI 指令)
不要写“要优雅”,要写“绝对禁止”。针对 Go 的写法:
| Go 常见烂代码 | Skill 里的铁律写法(直接复制进你的规则) |
|---|---|
| 吞掉错误 | data, _ := db.Find(...)→“出现_ =或裸_接收 err,直接拒绝执行” |
| 循环内拼接字符串 | for { str += item }→“循环内拼接字符串必须用strings.Builder” |
| 不传递 Context | db.Query(sql)→“所有 DB/Redis/gRPC 调用必须带ctx context.Context参数” |
| 魔法常量 | if status == 2→“业务状态码必须使用const或iota,不准写数字字面量” |
| 返回裸 error | return errors.New("fail")→“必须用fmt.Errorf("xxx: %w", err)包裹上下文” |
3. 自动化兜底(告诉 AI 自检命令)
Go 有极强的官方工具链,必须让 AI 在写完代码后自动(或提醒)跑一遍:
“代码交付前,AI 必须按顺序执行以下命令进行自检,若未通过则禁止交付:
go vet ./...(静态检查)
gofmt -l .(格式化检查)
go mod tidy(依赖清理)”
第四步:把“架构细节”扔进references/(防止 AI 上下文爆炸)
你在code-guard里画的那张漂亮的 ASCII 架构图和car/目录树,正是 AI 最容易“看了就忘”或“占满脑子”的部分。
Go 程序员的处理方式:把它们拆出去。
在SKILL.md里只留一句引用:
“当需要确认文件存放路径或服务间调用关系时,请 AI 主动读取
references/project-struct.md中的架构图和目录树。”
这样,AI 只有在准备新建文件或跨服务调用时,才会去翻目录,平时写业务逻辑时根本不会加载这部分无用 Token。
Skill 还可以再进化一步——注入“生成代码”的能力。
你可以专门写一个 Skill 叫go-proto-generator,它的scripts/下放一个gen.sh。
当用户说“根据这个表结构生成 gRPC 服务”时,AI 不是直接生成乱码,而是执行你的脚本,并遵循SKILL.md里的规则:
order.proto必须在Common/proto/order/生成的
pb.go必须使用//go:generate protoc ...注解service.go必须实现UnimplementedOrderServer
📝 给你的“从 0 到 1”速查清单(下次直接用)
| 步骤 | Go 程序员专属动作 |
|---|---|
| 0. 找痛点 | 翻最近的 Git 提交记录,看 CR 时改得最多的是什么 |
| 1. 建目录 | mkdir skill-name && cd $_ && mkdir references scripts |
| 2. 写 SKILL.md | 只写:触发词 + 绝对禁止列表 + 自检命令(go vet) |
| 3. 移文档 | 架构图、Nacos配置、表结构 ER 图,扔进references/ |
| 4. 写脚本 | 把gofmt、go mod、protoc命令写成.sh文件 |
| 5. 压测 | 故意给 AI 一个带_ = err的烂代码,看它会不会拒绝执行 |