Go/Rust/Python——不同语言怎么用Skill
本文约2500字,阅读需要5分钟
不同编程语言的AI编程体验差异很大。
AI写Python,基本都能跑。写Rust,经常编译不过。写Go,能编译但代码不地道。
原因是训练数据里Python代码最多,Go和Rust相对少。
语言专用Skill就是弥补这个差距的。
Go Skill:强制idiomatic Go
来自samber/cc-skills-golang。
Go社区对代码风格有很强的共识。"idiomatic Go"是判断代码质量的黄金标准。
核心约束:
Go代码生成规则:
1. 错误处理
- 永远不要忽略error(禁止 _ = func())
- 用errors.Is/As做错误判断,不要用==
- 错误信息小写开头,不加标点
2. 并发
- 用context传递取消信号
- goroutine生命周期必须可控(有退出机制)
- channel关闭由发送方负责
3. 接口
- 接口要小(1-3个方法)
- 在使用方定义接口,不是实现方
- 用接口做依赖注入
4. 测试
- 用testify库写断言
- 用表驱动测试(Table-Driven Tests)
- 用httptest做HTTP测试
5. Go风格
- 不用泛型炫技(只在真正需要时用)
- 变量名要短(用ctx不用context,用r不用reader)
- 导出函数必须有注释
Rust Skill:帮AI过编译关
Rust的编译器很严格。AI经常写出编译不过的代码——生命周期标注错误、所有权转移问题、trait bound不满足。
核心约束:
Rust代码生成规则:
1. 所有权
- 优先用引用(&T)而不是转移所有权
- 需要共享所有权时用Arc
- 不要无脑clone
2. 生命周期
- 函数签名中必须标注生命周期
- 避免在struct中存储引用(用owned type)
3. 错误处理
- 用Result<T, E>而不是panic
- 用thiserror定义错误类型
- 用anyhow做应用级错误处理
4. 性能
- 优先用&str而不是String做参数
- 用.iter()而不是for i in 0..len
- 注意零成本抽象的边界
5. 编译检查
- 代码生成后,必须运行 cargo check
- 有编译错误必须修复
- 有clippy警告必须修复
Python Skill:防止"能跑就行"
Python的问题是太容易写了。AI经常写出"能跑但不工程化"的代码。
核心约束:
Python代码生成规则:
1. 类型
- 所有函数必须有类型注解
- 用mypy检查(--strict模式)
- 禁止Any类型
2. 异步
- IO操作用async/await
- 禁止混用同步和异步代码
- 用asyncio.gather做并发
3. 工程化
- 用pathlib代替os.path
- 用dataclass/pydantic代替dict
- 用logging代替print
- 用f-string代替%或.format()
4. 测试
- 用pytest
- 用fixture管理测试数据
- 用mock隔离外部依赖
跨语言项目Skill配置
一个后端Go + 前端React的项目:
{
"skills": {
"golang-best-practices": {
"scope": ["backend/", "api/"]
},
"react-best-practices": {
"scope": ["frontend/", "components/"]
},
"engineering-best-practices": {
"scope": ["*"]
}
}
}
不同目录用不同语言Skill,根目录用通用工程Skill。
不要过度约束
语言Skill最容易犯的错误:规则太多。
一个好的语言Skill,规则不超过20条。挑最关键的写,剩下的让AI自己发挥。
规则选取优先级:
- 2. 社区共识极强、不这样写会被喷的(Go的error处理、Rust的所有权)
其他风格问题,比如变量命名、文件组织结构,不用写到Skill里。
🎁 福利
关注公众号,回复「语言」,获取:
- 1. Go/Rust/Python Skill配置模板
下一篇:GitHub出了个桌面App,同时管多个AI Agent
专注GitHub热门AI工具拆解
每篇一个项目,看完就能用