主题
基础类型完全理解指南
基础类型完全理解指南
这是一个系列。 如果你是刚学 Rust,或者已经写了一段时间但总觉得「类型选得不踏实」, 那你来对地方了。
📚 本系列你将学到什么?
- Rust 为什么逼你选类型
- 各种类型什么时候该用,什么时候不该用
- 如何通过类型系统,提前减少 bug
📌 本篇目标(第一篇)
从 “我知道 Rust 有这些类型” 到 “我知道该怎么选这些类型”
〇、Rust 基础类型全景速览
新手第一原则:先看清全局,再钻细节
标量类型(Scalar Types)
- 有符号整数:
i8i16i32i64i128isize - 无符号整数:
u8u16u32u64u128usize - 浮点数:
f32f64 - 字符:
char - 布尔值:
bool - 单元类型:
()
复合类型(Composite Types)
- 数组:
[T; N] - 元组:
(T1, T2, ...)
一、Rust 的类型设计哲学(一句话先讲透)
Rust 的类型系统只做一件事:
逼你在写代码时,把“这个值的含义”想清楚。
不是为了多,而是为了准。
二、标量类型(Scalar Types)
Rust 的标量类型一览
- 有符号整数:
i8i16i32i64i128isize - 无符号整数:
u8u16u32u64u128usize - 浮点数:
f32f64 - 字符:
char - 布尔值:
bool - 单元类型:
()
🧠 一句话记忆卡片
标量类型 = 不能再拆的小值类型
三、有符号整数(i) vs 无符号整数(u)
1️⃣ 有符号整数(i 系列)
能表示:
- 正数
- 0
- 负数
rust
let delta: i32 = -5;典型场景:
- 差值
- 增减
- 偏移
- 坐标
- 金额变化
2️⃣ 无符号整数(u 系列)
只能表示:
- 0
- 正数
rust
let count: u32 = 100;典型场景:
- 数量
- 长度
- 次数
- ID(确定不会为负)
🧠 一句话记忆卡片
可能为负 → 用
i绝不为负 → 用
u
四、i16 / i32 / i64 / i128 怎么选?
默认结论先给出
90% 的业务场景,用
i32就对了
各类型使用场景
i16
- 占内存小
- 网络协议
- 二进制格式
- 嵌入式
rust
let port: i16 = 8080;i32(⭐ 默认首选)
- 业务数据
- 状态值
- 普通计算
rust
let score: i32 = 100;i64
- 时间戳
- 金额(分)
- 大数据计数
rust
let timestamp: i64 = 1_700_000_000;i128
- 超大整数
- 金融 / 密码学
- 高精度计算
rust
let big: i128 = 1_000_000_000_000;🧠 一句话记忆卡片
不确定 →
i32整数 →
i32时间 / 金额 →
i64特殊需求 →
i16/i128
五、u16 / u32 / u64 / u128 怎么选?
逻辑和 i 系列完全一致,只是不能为负。
常见选型
u16
- 端口号
- 协议字段
rust
let port: u16 = 8080;u32(最常见)
- 数量
- 状态码
- 普通计数
rust
let users: u32 = 1000;u64
- 超大计数
- 文件大小
- 请求总量
rust
let file_size: u64 = 10_000_000;u128
- 特殊领域
- 极大数值
🧠 一句话记忆卡片
数量型数据:
u32起步特别大:
u64
六、usize 和 isize(新手最容易迷糊)
1️⃣ usize 是什么?
和“内存大小 / 索引”绑定的整数
rust
let len: usize = vec.len();必须用 usize 的地方:
- 数组索引
- 长度
- size / capacity
2️⃣ isize 是什么?
表示“向前 / 向后移动多少”的整数
rust
let offset: isize = -1;常见于:
- 偏移量
- 指针运算
- 底层代码
🧠 一句话记忆卡片
数东西 →
usize挪位置 →
isize
七、浮点数 f32 / f64
为什么 Rust 默认用 f64?
rust
let price: f64 = 99.99;- 精度更高
- CPU 原生支持
- 误差更小
f32 适合什么时候?
- 图形学
- 游戏
- 嵌入式
- 对性能 / 内存极度敏感
🧠 一句话记忆卡片
精度优先 →
f64性能 / 内存优先 →
f32
八、char:不是“一个字节”
rust
let c: char = '你';
let e: char = '😂';- 4 字节
- Unicode 标量值
🧠 一句话记忆卡片
Rust 的 char = 一个 Unicode 字符
九、复合类型(Composite Types)
1️⃣ 数组
rust
let arr = [1, 2, 3];- 固定长度
- 同类型
2️⃣ 元组
rust
let tup = (1, true, "hi");- 不同类型
- 固定结构
🧠 一句话记忆卡片
数组:一堆同类
元组:一个结构
十、&str 和 String
&str(借用)
rust
fn greet(name: &str) {}- 不拥有数据
- 不可修改
- 轻量
String(拥有)
rust
let mut s = String::from("hi");
s.push_str("!");- 拥有数据
- 可修改
- 在堆上
🧠 一句话记忆卡片
参数用
&str存储 / 修改用
String
十一、变量、可变性与作用域
1️⃣ 默认不可变
rust
let x = 10;2️⃣ 可变变量
rust
let mut x = 10;
x = 20;3️⃣ 变量作用域(Scope)
rust
{
let x = 10;
}
// x 在这里不存在变量只在声明的
{}内有效
4️⃣ 作用域 + 所有权
rust
let s = String::from("hello");
{
let t = s;
}
// s 已失效- 离开作用域 → 自动释放
- 没有 GC
- 没有悬挂指针
5️⃣ 变量遮蔽(非常重要)
rust
let x = "42";
let x: i32 = x.parse().unwrap();- 类型升级
- 不用
mut - 逻辑更清晰
🧠 一句话记忆卡片
作用域 = 生命周期边界
mut = 修改权限
遮蔽 = 阶段升级
十二、const 和 static
const(首选)
rust
const MAX_RETRY: u32 = 3;- 编译期
- 无地址
static(慎用)
rust
static APP_NAME: &str = "App";- 有固定地址
- 全局存在
🧠 一句话记忆卡片
90% 用
conststatic是高级工具
十三、终极选型速记(工程版)
- 数量 / 长度 →
usize - 普通业务数 →
i32 - 时间 / 金额 →
i64 - 参数字符串 →
&str - 存储字符串 →
String - 全局常量 →
const
Rust 类型系统的真正价值在于: 你一旦选对类型,后面的 bug 会少一大半。