🦀 Rust 开发

Rust是Mozilla主导开发的系统编程语言,2015年发布1.0版本。核心特性:内存安全、零成本抽象、并发安全。

学习时间线

2021年7月 - 2022年3月(9个月)

阶段一:所有权系统(2021-07)

  • 环境搭建、工具链

  • 所有权、借用、生命周期

  • 引用规则、切片

阶段二:基础语法(2021-08)

  • 数据类型、变量、函数

  • 控制流、模式匹配

  • 结构体、枚举

  • Vector、String、HashMap

阶段三:类型系统(2021-10)

  • 错误处理(Result、Option、?运算符)

  • 泛型、Trait

  • 生命周期注解

  • 关联类型、运算符重载

阶段四:并发编程(2021-12)

  • 智能指针(Box、Rc、Arc、RefCell、Mutex)

  • 线程、消息传递

  • 共享状态、Send/Sync trait

  • 无畏并发原理

阶段五:异步编程(2022-02)

  • async/await、Future

  • Tokio运行时

  • 异步I/O、Stream

  • 异步通道、同步原语

学习文档

  1. 01-环境搭建与所有权.md - Rust环境、所有权系统、借用规则

  2. 02-基础语法.md - 数据类型、控制流、结构体、枚举、集合

  3. 03-错误处理与Trait.md - Result/Option、泛型、Trait、生命周期

  4. 04-并发与智能指针.md - 智能指针、线程、Channel、Mutex、Arc

  5. 05-异步编程.md - async/await、Tokio、异步I/O、HTTP服务器

Rust核心特性

内存安全

  • 所有权系统:每个值有唯一所有者

  • 借用检查:编译期保证引用有效性

  • 无GC:零运行时开销

  • 消除悬空指针:编译器阻止

  • 消除数据竞争:类型系统保证

零成本抽象

  • 泛型单态化:编译期展开

  • Trait对象:动态分发可选

  • 迭代器:编译为循环

  • 闭包:零开销捕获

  • 性能接近C:无运行时

并发安全

  • Send trait:可跨线程转移

  • Sync trait:可跨线程共享

  • 编译期检查:消除数据竞争

  • 类型系统保证:无需运行时检查

  • 消息传递/共享状态:两种并发模式

工具链

  • Cargo:构建工具、包管理

  • rustfmt:代码格式化

  • clippy:Lint工具

  • rust-analyzer:LSP服务器

  • rustup:工具链管理

应用场景

系统编程

  • 操作系统内核(Redox OS)

  • 嵌入式开发

  • 驱动程序

  • 文件系统

命令行工具

  • ripgrep(文本搜索)

  • fd(文件查找)

  • bat(cat替代)

  • exa(ls替代)

  • delta(diff工具)

Web后端

  • Actix Web(高性能)

  • Axum(现代框架、Tower生态、异步支持)

  • Rocket(类型安全)

  • Warp(函数式风格)

WebAssembly

  • Yew(前端框架)

  • trunk(构建工具)

  • wasm-bindgen(JS互操作)

区块链

  • Polkadot、Solana、NEAR

  • Substrate框架

游戏开发

  • Bevy游戏引擎

  • Amethyst引擎

技术栈

Web开发

  • 框架:Axum、Actix Web、Rocket

  • ORM:Diesel、SeaORM、sqlx

  • 序列化:serde、serde_json

  • HTTP客户端:reqwest、hyper

  • 模板:askama、tera

异步生态

  • 运行时:Tokio、async-std

  • 工具:tokio-util、futures

  • HTTP:hyper、reqwest

  • WebSocket:tokio-tungstenite

数据处理

  • JSON:serde_json

  • YAML:serde_yaml

  • TOML:toml

  • CSV:csv

  • 正则:regex

测试

  • 单元测试:内置#[test]

  • 属性测试:proptest、quickcheck

  • 模拟:mockall

  • 基准测试:criterion

学习资源

官方文档

  • The Rust Programming Language(官方书)

  • Rust by Example

  • Rustonomicon(高级内容)

  • Async Book(异步编程)

在线资源

  • docs.rs(库文档)

  • crates.io(包仓库)

  • Rust Playground(在线运行)

  • cheats.rs(速查表)

推荐书籍

  • Programming Rust

  • Rust for Rustaceans

  • Zero To Production In Rust

常用Crate

基础工具

[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tokio = { version = "1", features = ["full"] }
anyhow = "1.0"
thiserror = "1.0"

Web服务器

[dependencies]
axum = "0.7"
tokio = { version = "1", features = ["full"] }
tower = "0.4"

数据库

[dependencies]
sqlx = { version = "0.7", features = ["runtime-tokio", "postgres"] }
diesel = { version = "2.1", features = ["postgres"] }

最佳实践

代码组织

src/
├── main.rs          # 二进制入口
├── lib.rs           # 库入口
├── bin/             # 多个二进制
├── models/          # 数据模型
├── handlers/        # 处理器
└── utils/           # 工具函数

错误处理

// 库:返回具体错误类型
pub enum MyError {
    Io(std::io::Error),
    Parse(ParseError),
}

// 应用:使用anyhow
fn main() -> anyhow::Result<()> {
    // ...
}

所有权规则

  • 默认不可变

  • 优先借用,避免克隆

  • 可变引用独占

  • 生命周期尽量简单

  • 返回所有权优于可变引用

并发原则

  • Send/Sync由编译器保证

  • 优先消息传递

  • 共享状态用Arc<Mutex>

  • 读多写少用Arc<RwLock>

  • 原子操作用Atomic*

异步建议

  • 避免阻塞运行时

  • CPU密集用spawn_blocking

  • I/O密集用async

  • 使用超时机制

  • 正确处理取消

编译优化

Cargo.toml配置

[profile.release]
opt-level = 3          # 最高优化
lto = true             # 链接时优化
codegen-units = 1      # 单一代码生成单元
strip = true           # 去除符号
panic = 'abort'        # 减小二进制

[profile.dev]
opt-level = 1          # 开发时适度优化

[profile.dev.package."*"]
opt-level = 3          # 依赖完全优化

性能分析

# CPU profile
cargo build --release
perf record ./target/release/app
perf report

# 内存分析
valgrind --tool=massif ./target/release/app

# Benchmark
cargo bench

交叉编译

# 安装目标
rustup target add x86_64-pc-windows-gnu

# 编译
cargo build --target x86_64-pc-windows-gnu

# 支持的目标
rustup target list

常见陷阱

1. 所有权移动

// ❌ 错误
let s1 = String::from("hello");
let s2 = s1;
println!("{}", s1);  // 错误:s1已移动

// ✓ 正确
let s1 = String::from("hello");
let s2 = s1.clone();
println!("{}", s1);

2. 借用冲突

// ❌ 错误
let mut v = vec![1, 2, 3];
let r = &v[0];
v.push(4);  // 错误:已有不可变借用
println!("{}", r);

// ✓ 正确
let mut v = vec![1, 2, 3];
{
    let r = &v[0];
    println!("{}", r);
}
v.push(4);

3. 生命周期

// ❌ 错误
fn dangle() -> &String {
    let s = String::from("hello");
    &s  // 错误:返回局部变量引用
}

// ✓ 正确
fn no_dangle() -> String {
    String::from("hello")
}

项目实践

CLI工具

  • 使用clap解析参数

  • anyhow处理错误

  • env_logger日志

Web服务

  • Axum框架

  • Tokio运行时

  • sqlx数据库

  • tower中间件

性能优化

  • 减少克隆

  • 使用&str而非String

  • 预分配容量

  • 避免不必要的分配

  • 使用迭代器

学习心得

  1. 所有权核心:内存安全和并发安全的基础

  2. 编译器严格:编译通过基本无运行时错误

  3. 类型系统完备:泛型、Trait、生命周期

  4. 零成本抽象:高级特性无性能损失

  5. 异步高效:Tokio生态完善

  6. 工具链优秀:Cargo、rustfmt、clippy

  7. 性能接近C:适合系统编程

  8. 社区活跃:crates.io包丰富

  9. 文档完善:docs.rs质量高

  10. 安全第一:编译期消除大部分bug

核心: Rust通过所有权系统和类型系统在编译期保证内存安全和并发安全,实现零成本抽象和高性能。