何时使用
- 用 Rust 1.75+ 构建服务、库或系统级工具,需要内存安全 + 高性能并存时使用。
- 攻克所有权 / 借用 / 生命周期 / async 设计难题,或要做零成本抽象、并发与性能优化时使用。
- 触发词:Rust、async、Tokio、所有权、生命周期、unsafe、FFI、cargo、trait。
不该用的边界:
- 只要一次性脚本或动态运行时(要快、要热改)→ 选 Python/脚本语言,别上 Rust。
- 只是查基础语法(
for/match怎么写)→ 直接给语法即可,不必启用本技能的体系化方法。 - 技术栈无法引入 Rust(团队/部署约束)→ 不适用。
- 纯依赖审计 / 纯性能剖析另有专技 → 见「互见」。
步骤 / 指令
1. 明确约束:性能目标、安全边界(是否允许 unsafe)、运行时(同步/异步/no_std/嵌入)、目标平台。
2. 选型:
- 异步运行时 → 默认 Tokio;Web 服务用 axum + tower + hyper;gRPC 用 tonic;DB 用 sqlx。
- 错误处理 → 库用 thiserror 定义类型化错误;二进制入口用 anyhow 聚合上下文。
- 序列化 → serde。
3. 用类型系统把不变量编译期化:newtype、marker trait、状态机用类型表达;优先 Result 显式错误,杜绝 unwrap 进生产。
4. 实现 + 测试同步推进:单测、集成测、文档测试;属性测试用 proptest,基准用 criterion。
5. 过质量门:cargo fmt、cargo clippy(-D warnings)、cargo test,CI 串起来;依赖体检 cargo audit/deny。
6. 仅在热点处剖析优化:cargo flamegraph / perf 定位,再考虑无锁、SIMD、缓存友好布局;不要凭感觉提前优化。
7. unsafe 与 FFI:用安全封装包住 unsafe,每个 unsafe 块写明 // SAFETY: 不变量;FFI 绑定用 bindgen 生成。
核心规则:
- 让类型系统替你做正确性检查——能编译期保证就不要运行时判断。
- 内存安全不让位于性能:靠零成本抽象,避免不必要的
clone/Arc<Mutex<>>滥用。 - 错误一律显式
Result,不吞、不裸 panic;panic 仅用于不可恢复的程序 bug。 - 每个 unsafe 块必须有
// SAFETY:注释说明为何成立,并尽量缩小其范围。 - 遵循社区惯例(clippy 默认 lint 即风格基线),优先函数式组合子(
map/and_then/?)。
示例
最小工程骨架与质量门命令:
cargo new mysvc && cd mysvc
cargo add tokio --features full
cargo add axum thiserror anyhow serde --features serde/derive
# 质量门(建议进 CI)
cargo fmt --all -- --check
cargo clippy --all-targets -- -D warnings
cargo test --all
cargo bench # 需 criterion
cargo audit # 依赖漏洞
cargo flamegraph # 热点剖析
类型化错误(库侧 thiserror + 入口 anyhow):
use thiserror::Error;
#[derive(Error, Debug)]
pub enum StoreError {
#[error("key not found: {0}")]
NotFound(String),
#[error("io failure")]
Io(#[from] std::io::Error),
}
// 入口处用 anyhow 聚合上下文
use anyhow::Context;
fn load(path: &str) -> anyhow::Result<String> {
std::fs::read_to_string(path).with_context(|| format!("reading {path}"))
}
最小 Tokio + axum 异步服务:
use axum::{routing::get, Router};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let app = Router::new().route("/health", get(|| async { "ok" }));
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await?;
axum::serve(listener, app).await?;
Ok(())
}
unsafe 块的安全注释规范:
// SAFETY: ptr 来自 Box::into_raw,对齐且非空,且本作用域内独占,无其他别名。
let val = unsafe { &mut *ptr };
典型请求样例(可直接当提示词):
- 「设计一个高性能 async Web 服务,错误处理完备」
- 「实现一个用原子操作的无锁并发数据结构」
- 「为某 C 库用 FFI 写一个安全封装」
- 「修复这段复杂泛型代码里的生命周期报错」
注意事项
- 不要拿 unwrap/expect 当错误处理进生产;它们只用于「逻辑上不可能失败」且已注释说明的场景。
- 避免无脑
Arc<Mutex<T>>:先考虑消息传递(mpsc/broadcast/watch)、&/借用或Rc(单线程)。 - async 里别做阻塞调用(同步 IO、重 CPU),用
spawn_blocking或专用线程池,否则拖垮整个 runtime。 - 优化前先剖析:用 flamegraph/perf 找到真热点再动手;过早优化常牺牲可读性却无收益。
clippy -D warnings当作硬门禁;GATs、const 泛型等高级特性按需用,别为炫技增加维护成本。- unsafe 是最后手段:先穷尽安全方案,无法避免时把它锁进最小安全封装并写 SAFETY 不变量。
- 输出不能替代环境内的实测、编译与评审;缺少关键约束(运行时/平台/安全边界)时先发问再动手。
互见
- requires:无。
- related:
performance-profiler(系统化性能剖析与火焰图分析,本技能聚焦写 Rust 本身,深度调优转交它);backend-architecture-patterns(服务分层与架构取舍,先定架构再用本技能落地 Rust 实现)。 - combines_with:
code-reviewer(Rust 代码写完后做正确性与质量审查);dependency-auditor(对 Cargo 依赖做许可证与已知漏洞专项体检,补足 cargo audit 之外的治理)。
采编自 sickn33/antigravity-awesome-skills(源技能 rust-pro,MIT 许可)。