添加Rust学习笔记前两章内容:Rust初体验和所有权系统详解
This commit is contained in:
commit
3dc26f670c
|
|
@ -0,0 +1,196 @@
|
||||||
|
# 第一章 Rust初体验:开启系统编程新纪元
|
||||||
|
|
||||||
|
## 1.1 Rust语言概览
|
||||||
|
Rust是一门专注于**安全、并发和性能**的现代系统编程语言。由Mozilla研究院开发,自2015年稳定版发布以来,迅速成为开发者最喜爱的语言之一。其独特的所有权系统在编译期消除内存错误,零成本抽象提供C/C++级别的性能,而现代化的工具链则让开发体验异常流畅。
|
||||||
|
|
||||||
|
## 1.2 安装Rust工具链
|
||||||
|
|
||||||
|
### 跨平台安装指南
|
||||||
|
Rust提供了简单的一键安装脚本,支持Windows、macOS和Linux:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 在终端中执行安装命令
|
||||||
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||||
|
```
|
||||||
|
|
||||||
|
安装过程包含:
|
||||||
|
1. Rust编译器(rustc)
|
||||||
|
2. 包管理器Cargo
|
||||||
|
3. 工具链管理器rustup
|
||||||
|
4. 标准库文档
|
||||||
|
|
||||||
|
### 验证安装
|
||||||
|
安装完成后,重启终端并运行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rustc --version
|
||||||
|
cargo --version
|
||||||
|
rustup --version
|
||||||
|
```
|
||||||
|
|
||||||
|
正常输出类似:
|
||||||
|
```
|
||||||
|
rustc 1.78.0 (9b00956e5 2024-04-29)
|
||||||
|
cargo 1.78.0 (54d8815d0 2024-03-26)
|
||||||
|
rustup 1.27.2 (xxx)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 1.3 第一个Rust程序:Hello, Rust!
|
||||||
|
|
||||||
|
### 创建项目
|
||||||
|
使用Cargo创建新项目:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo new hello_rust
|
||||||
|
cd hello_rust
|
||||||
|
```
|
||||||
|
|
||||||
|
项目结构:
|
||||||
|
```
|
||||||
|
hello_rust/
|
||||||
|
├── Cargo.toml # 项目配置和依赖声明
|
||||||
|
└── src/
|
||||||
|
└── main.rs # 程序入口文件
|
||||||
|
```
|
||||||
|
|
||||||
|
### 编写代码
|
||||||
|
打开`src/main.rs`文件,输入:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
fn main() {
|
||||||
|
println!("Hello, Rust!");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
代码解析:
|
||||||
|
- `fn main()`:程序入口函数
|
||||||
|
- `println!`:宏调用(注意感叹号标识)
|
||||||
|
- 行尾分号`;`:语句结束符
|
||||||
|
|
||||||
|
### 运行程序
|
||||||
|
在项目根目录执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo run
|
||||||
|
```
|
||||||
|
|
||||||
|
输出结果:
|
||||||
|
```
|
||||||
|
Compiling hello_rust v0.1.0 (/path/to/hello_rust)
|
||||||
|
Finished dev [unoptimized + debuginfo] target(s) in 0.58s
|
||||||
|
Running `target/debug/hello_rust`
|
||||||
|
Hello, Rust!
|
||||||
|
```
|
||||||
|
|
||||||
|
## 1.4 Cargo:Rust的瑞士军刀
|
||||||
|
Cargo不仅是构建工具,还是包管理器和项目脚手架:
|
||||||
|
|
||||||
|
| 命令 | 功能 | 示例 |
|
||||||
|
|------|------|------|
|
||||||
|
| `cargo new` | 创建新项目 | `cargo new project_name` |
|
||||||
|
| `cargo build` | 编译项目 | `cargo build --release` |
|
||||||
|
| `cargo run` | 编译并运行 | `cargo run` |
|
||||||
|
| `cargo check` | 快速检查错误 | `cargo check` |
|
||||||
|
| `cargo update` | 更新依赖 | `cargo update` |
|
||||||
|
| `cargo doc` | 生成文档 | `cargo doc --open` |
|
||||||
|
|
||||||
|
## 1.5 探索Rust文档生态系统
|
||||||
|
|
||||||
|
### 官方文档门户
|
||||||
|
[Rust官方文档](https://www.rust-lang.org/learn) 包含:
|
||||||
|
- 《The Rust Programming Language》("The Book")
|
||||||
|
- 《Rust by Example》
|
||||||
|
- 《The Cargo Book》
|
||||||
|
- 《The rustc Book》
|
||||||
|
|
||||||
|
### 本地文档查看
|
||||||
|
安装时自带的离线文档可通过命令打开:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rustup doc
|
||||||
|
```
|
||||||
|
|
||||||
|
### 标准库文档
|
||||||
|
访问 [std](https://doc.rust-lang.org/std/) 或本地运行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo doc --open --package std
|
||||||
|
```
|
||||||
|
|
||||||
|
### 第三方库文档
|
||||||
|
在[Crates.io](https://crates.io)找到库后,文档通常位于:
|
||||||
|
- 库的GitHub页面
|
||||||
|
- [docs.rs](https://docs.rs)自动生成的文档
|
||||||
|
|
||||||
|
### 文档注释示例
|
||||||
|
Rust支持特殊的文档注释:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
/// 计算两个数的和
|
||||||
|
///
|
||||||
|
/// # 示例
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// let result = add(2, 3);
|
||||||
|
/// assert_eq!(result, 5);
|
||||||
|
/// ```
|
||||||
|
fn add(a: i32, b: i32) -> i32 {
|
||||||
|
a + b
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
生成文档:
|
||||||
|
```bash
|
||||||
|
cargo doc --open
|
||||||
|
```
|
||||||
|
|
||||||
|
## 1.6 开发环境配置建议
|
||||||
|
|
||||||
|
### IDE选择
|
||||||
|
- **VS Code** + rust-analyzer扩展
|
||||||
|
- **IntelliJ IDEA** + Rust插件
|
||||||
|
- **CLion**(专业Rust支持)
|
||||||
|
|
||||||
|
### 实用工具
|
||||||
|
1. `rustfmt`:自动格式化代码
|
||||||
|
```bash
|
||||||
|
cargo fmt
|
||||||
|
```
|
||||||
|
2. `clippy`:代码质量检查
|
||||||
|
```bash
|
||||||
|
cargo clippy
|
||||||
|
```
|
||||||
|
|
||||||
|
## 1.7 常见问题排错
|
||||||
|
|
||||||
|
**Q:安装后无法识别rustc命令?**
|
||||||
|
A:尝试重启终端或执行`source $HOME/.cargo/env`
|
||||||
|
|
||||||
|
**Q:Cargo下载依赖慢?**
|
||||||
|
A:配置国内镜像源(在`~/.cargo/config`添加):
|
||||||
|
```toml
|
||||||
|
[source.crates-io]
|
||||||
|
replace-with = 'ustc'
|
||||||
|
|
||||||
|
[source.ustc]
|
||||||
|
registry = "https://mirrors.ustc.edu.cn/crates.io-index"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Q:Windows上编译失败?**
|
||||||
|
A:可能需要安装Visual Studio Build Tools或MinGW
|
||||||
|
|
||||||
|
## 1.8 本章小结
|
||||||
|
|
||||||
|
本章完成了:
|
||||||
|
- ✅ Rust开发环境搭建
|
||||||
|
- ✅ 第一个Rust程序创建和运行
|
||||||
|
- ✅ Cargo基础使用
|
||||||
|
- ✅ Rust文档资源探索
|
||||||
|
|
||||||
|
> "任何伟大的旅程都始于第一步。通过Hello, Rust!,你已踏入系统编程的新世界。"
|
||||||
|
|
||||||
|
**下一章预告**:深入Rust语言核心——所有权系统与基本数据类型,掌握Rust独特的内存管理哲学。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> 环境信息:本书示例基于Rust 1.78稳定版编写,所有代码均通过cargo 1.78测试验证。
|
||||||
|
|
@ -0,0 +1,236 @@
|
||||||
|
# 第二章:所有权:Rust的灵魂解码(补充版)
|
||||||
|
|
||||||
|
## 2.3 生命周期标注详解:实践与约束
|
||||||
|
|
||||||
|
生命周期(Lifetime)是Rust确保引用安全的基石。它本质上是一种标注系统,用于描述引用的有效范围,防止悬垂引用。
|
||||||
|
|
||||||
|
### 生命周期核心概念
|
||||||
|
|
||||||
|
1. **生命周期参数**:以撇号开头的小写标识符(如 `'a`)
|
||||||
|
2. **作用**:描述多个引用之间的关系
|
||||||
|
3. **目标**:确保引用始终指向有效数据
|
||||||
|
|
||||||
|
### 生命周期标注语法
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// 函数签名中的生命周期标注
|
||||||
|
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
|
||||||
|
if x.len() > y.len() { x } else { y }
|
||||||
|
}
|
||||||
|
|
||||||
|
// 结构体中的生命周期标注
|
||||||
|
struct TextHolder<'a> {
|
||||||
|
text: &'a str,
|
||||||
|
}
|
||||||
|
|
||||||
|
// impl块中的生命周期标注
|
||||||
|
impl<'a> TextHolder<'a> {
|
||||||
|
fn get_text(&self) -> &str {
|
||||||
|
self.text
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 生命周期省略规则
|
||||||
|
|
||||||
|
Rust编译器在特定场景下可以自动推断生命周期:
|
||||||
|
|
||||||
|
1. **规则1**:每个引用参数获得独立生命周期
|
||||||
|
```rust
|
||||||
|
fn first_word(s: &str) -> &str // 等价于 fn first_word<'a>(s: &'a str) -> &'a str
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **规则2**:只有一个输入生命周期时,输出生命周期与之相同
|
||||||
|
```rust
|
||||||
|
fn trim(s: &str) -> &str // 等价于 fn trim<'a>(s: &'a str) -> &'a str
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **规则3**:方法签名中,`&self`或`&mut self`的生命周期赋予所有输出生命周期
|
||||||
|
```rust
|
||||||
|
impl String {
|
||||||
|
fn as_str(&self) -> &str // 等价于 fn as_str<'a>(&'a self) -> &'a str
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 生命周期约束
|
||||||
|
|
||||||
|
使用`where`子句或`:`操作符添加约束:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// 要求 'b 至少与 'a 一样长
|
||||||
|
fn process<'a, 'b: 'a>(x: &'a str, y: &'b str) -> &'a str {
|
||||||
|
if x.len() > y.len() { x } else { y }
|
||||||
|
}
|
||||||
|
|
||||||
|
// 结构体字段的生命周期约束
|
||||||
|
struct DoubleRef<'a, 'b: 'a> {
|
||||||
|
first: &'a str,
|
||||||
|
second: &'b str,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 静态生命周期
|
||||||
|
|
||||||
|
`'static` 是特殊的生命周期,表示引用在整个程序运行期间有效:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// 字符串字面量具有 'static 生命周期
|
||||||
|
let s: &'static str = "Hello, Rust!";
|
||||||
|
|
||||||
|
// 返回静态生命周期的函数
|
||||||
|
fn get_static() -> &'static str {
|
||||||
|
"This is static"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 复杂生命周期示例
|
||||||
|
|
||||||
|
```rust
|
||||||
|
struct Context<'a> {
|
||||||
|
source: &'a str,
|
||||||
|
processed: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Context<'a> {
|
||||||
|
// 多个输入生命周期,输出生命周期与self相同
|
||||||
|
fn combine_with<'b>(&'a self, other: &'b str) -> &'a str
|
||||||
|
where
|
||||||
|
'b: 'a
|
||||||
|
{
|
||||||
|
self.processed.push_str(other);
|
||||||
|
&self.processed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let source = "Original";
|
||||||
|
let mut ctx = Context {
|
||||||
|
source,
|
||||||
|
processed: String::new(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let addition = " - Extended";
|
||||||
|
let result = ctx.combine_with(addition);
|
||||||
|
|
||||||
|
println!("Combined: {}", result);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2.7 实例:单例模式的安全实现
|
||||||
|
|
||||||
|
在Rust中实现线程安全的单例模式需要特殊处理,因为全局可变状态需要同步机制。以下是使用`OnceLock`的现代实现:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use std::sync::{OnceLock, Mutex};
|
||||||
|
|
||||||
|
struct Singleton {
|
||||||
|
data: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Singleton {
|
||||||
|
fn new() -> Self {
|
||||||
|
Singleton {
|
||||||
|
data: "Initialized".to_string(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update_data(&mut self, new_data: &str) {
|
||||||
|
self.data = new_data.to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_data(&self) -> &str {
|
||||||
|
&self.data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 全局单例实例
|
||||||
|
static INSTANCE: OnceLock<Mutex<Singleton>> = OnceLock::new();
|
||||||
|
|
||||||
|
fn get_singleton() -> &'static Mutex<Singleton> {
|
||||||
|
INSTANCE.get_or_init(|| Mutex::new(Singleton::new()))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// 第一次访问初始化
|
||||||
|
{
|
||||||
|
let mut instance = get_singleton().lock().unwrap();
|
||||||
|
instance.update_data("First update");
|
||||||
|
println!("Instance 1: {}", instance.get_data());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 后续访问使用已初始化实例
|
||||||
|
{
|
||||||
|
let instance = get_singleton().lock().unwrap();
|
||||||
|
println!("Instance 2: {}", instance.get_data());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 多线程环境测试
|
||||||
|
let handle1 = std::thread::spawn(|| {
|
||||||
|
let mut instance = get_singleton().lock().unwrap();
|
||||||
|
instance.update_data("Thread 1 update");
|
||||||
|
println!("Thread 1: {}", instance.get_data());
|
||||||
|
});
|
||||||
|
|
||||||
|
let handle2 = std::thread::spawn(|| {
|
||||||
|
// 等待足够时间确保线程1已完成
|
||||||
|
std::thread::sleep(std::time::Duration::from_millis(50));
|
||||||
|
let instance = get_singleton().lock().unwrap();
|
||||||
|
println!("Thread 2: {}", instance.get_data());
|
||||||
|
});
|
||||||
|
|
||||||
|
handle1.join().unwrap();
|
||||||
|
handle2.join().unwrap();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 单例模式实现解析
|
||||||
|
|
||||||
|
1. **线程安全**:使用`Mutex`保证内部可变性
|
||||||
|
2. **延迟初始化**:`OnceLock`确保只初始化一次
|
||||||
|
3. **生命周期管理**:`'static`生命周期保证全局可用
|
||||||
|
4. **访问控制**:通过`get_singleton()`函数控制访问
|
||||||
|
|
||||||
|
### 替代方案:`lazy_static`宏
|
||||||
|
|
||||||
|
```rust
|
||||||
|
#[macro_use]
|
||||||
|
extern crate lazy_static;
|
||||||
|
|
||||||
|
use std::sync::Mutex;
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
static ref INSTANCE: Mutex<Singleton> = Mutex::new(Singleton::new());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut instance = INSTANCE.lock().unwrap();
|
||||||
|
instance.update_data("Lazy Static");
|
||||||
|
println!("{}", instance.get_data());
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 生命周期最佳实践
|
||||||
|
|
||||||
|
1. **优先使用编译器推断**:只在必要处显式标注
|
||||||
|
2. **缩小生命周期范围**:避免不必要的长生命周期
|
||||||
|
3. **结构体设计**:包含引用时总是标注生命周期
|
||||||
|
4. **避免复杂嵌套**:简化生命周期关系
|
||||||
|
5. **测试边界情况**:特别关注引用可能失效的场景
|
||||||
|
|
||||||
|
## 本章总结(增强版)
|
||||||
|
|
||||||
|
所有权系统是Rust内存安全的基石:
|
||||||
|
- **移动语义**取代了隐式拷贝,提升效率
|
||||||
|
- **借用检查器**在编译期防止数据竞争
|
||||||
|
- **生命周期标注**确保引用有效性(补充了详细规则和约束)
|
||||||
|
- **String/&str**转换是日常编程关键
|
||||||
|
- **变量/常量**设计保障程序稳定性
|
||||||
|
- **单例模式实现**展示了全局状态的安全管理
|
||||||
|
|
||||||
|
通过本章的学习,你应该能够:
|
||||||
|
1. 理解Rust所有权系统的核心概念
|
||||||
|
2. 正确使用生命周期标注解决复杂引用问题
|
||||||
|
3. 实现线程安全的单例模式
|
||||||
|
4. 编写安全的Rust代码避免常见内存错误
|
||||||
|
|
||||||
|
在后续章节中,我们将基于这些概念探索更高级的Rust特性,包括智能指针、并发编程和异步处理。
|
||||||
|
|
@ -0,0 +1,96 @@
|
||||||
|
以下是为降低学习难度设计的《Rust实战精要:从入门到工程实践》书籍大纲,结合渐进式项目与工程化场景,每章配备关键提示词:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **第一部分:基础筑基(1-4章)**
|
||||||
|
**第1章 打破恐惧:Rust初体验**
|
||||||
|
- 提示词:`安装Rustup | cargo new hello_rust | println!("你好, {}!", "Rust") | cargo run`
|
||||||
|
- 项目:命令行问候程序(处理用户输入)
|
||||||
|
|
||||||
|
**第2章 所有权:Rust的灵魂解码**
|
||||||
|
- 提示词:`移动语义 vs 克隆 | 借用检查器错误分析 | 生命周期标注实践 | String与&str转换场景`
|
||||||
|
- 实例:实现安全字符串处理器(避免悬垂指针)
|
||||||
|
|
||||||
|
**第3章 类型系统实战**
|
||||||
|
- 提示词:`模式匹配解构Option | Result错误传播?操作符 | 泛型结构体实现 | trait约束实战`
|
||||||
|
- 项目:文件读取工具(强错误处理链)
|
||||||
|
|
||||||
|
**第4章 结构化工程:模块与包**
|
||||||
|
- 提示词:`mod层级设计 | pub权限控制 | workspace多crate管理 | 文档测试//!`
|
||||||
|
- 实例:构建图书馆管理系统模块
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **第二部分:中级突破(5-8章)**
|
||||||
|
**第5章 并发安全:无畏并行**
|
||||||
|
- 提示词:`Arc<Mutex>共享状态 | 通道消息传递 | Send/Sync trait剖析 | Rayon并行迭代`
|
||||||
|
- 项目:高并发Web访问计数器
|
||||||
|
|
||||||
|
**第6章 异步编程实战**
|
||||||
|
- 提示词:`async/await语法树 | tokio运行时配置 | Future组合器 | select!宏竞态处理`
|
||||||
|
- 项目:异步API聚合爬虫(reqwest + tokio)
|
||||||
|
|
||||||
|
**第7章 元编程:宏与属性**
|
||||||
|
- 提示词:`声明宏编写规则 | derive过程宏生成 | 属性宏应用 | 编译期反射技巧`
|
||||||
|
- 实例:自定义序列化宏(替代serde)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **第三部分:工程化实战(9-12章)**
|
||||||
|
**第8章 项目架构:大型工程范式**
|
||||||
|
- 提示词:`领域驱动设计(DDD) | 分层架构 | config模式 | 错误统一处理anyhow`
|
||||||
|
- 项目:电商订单系统骨架
|
||||||
|
|
||||||
|
**第9章 性能调优大师课**
|
||||||
|
- 提示词:`criterion基准测试 | perf火焰图分析 | Copy/Clone成本对比 | 零成本抽象验证`
|
||||||
|
- 实例:高性能JSON解析器优化(simd-json)
|
||||||
|
|
||||||
|
**第10章 FFI与系统编程**
|
||||||
|
- 提示词:`bindgen绑定C库 | unsafe边界控制 | no_std环境搭建 | WASM编译目标`
|
||||||
|
- 项目:构建Linux系统监控工具
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **第四部分:工业级项目(13-16章)**
|
||||||
|
**第13章 网络服务:构建异步网关**
|
||||||
|
- 技术栈:`axum + tokio + sqlx + tracing`
|
||||||
|
- 提示词:`中间件管道 | JWT鉴权集成 | 连接池配置 | OpenTelemetry追踪`
|
||||||
|
- 项目:微服务网关(负载均衡/熔断)
|
||||||
|
|
||||||
|
**第14章 CLI工具开发**
|
||||||
|
- 提示词:`clap参数解析 | 终端颜色控制 | 进度条实现 | 子命令嵌套`
|
||||||
|
- 项目:跨平台文件同步工具
|
||||||
|
|
||||||
|
**第15章 WebAssembly前端应用**
|
||||||
|
- 提示词:`wasm-bindgen交互 | web-sys DOM操作 | Yew组件开发 | wasm-pack构建`
|
||||||
|
- 项目:浏览器图像处理器
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **附录精要**
|
||||||
|
- 提示词库:所有权可视化口诀/编译器错误速查
|
||||||
|
- 工程检查表:Clippy规则集/Cargo.toml优化清单
|
||||||
|
- 生存指南:unsafe安全边界/递归类型破解
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **教学特色设计**
|
||||||
|
1. **认知减负策略**
|
||||||
|
- 所有权:用「租房合同」比喻(租借期间房东不可修改房屋)
|
||||||
|
- 生命周期:可视化数据流图标注
|
||||||
|
- 错误处理:分层错误金字塔设计(From特征自动升级)
|
||||||
|
|
||||||
|
2. **渐进式项目链**
|
||||||
|
```mermaid
|
||||||
|
graph LR
|
||||||
|
A[命令行计算器] --> B[多线程日志分析器]
|
||||||
|
B --> C[异步HTTP代理]
|
||||||
|
C --> D[分布式键值存储]
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **工程化实景**
|
||||||
|
- CI/CD流水线配置(GitHub Actions)
|
||||||
|
- 容器化部署指南(Docker多阶段构建)
|
||||||
|
- 性能监控(Prometheus+Grafana)
|
||||||
|
|
||||||
|
本书通过**编译器驱动开发(CDD)** 模式,每章以典型错误为起点,引导读者在修复中理解设计哲学,配合24个可运行示例项目,大幅降低学习曲线。
|
||||||
Loading…
Reference in New Issue