Skip to content

基础类型完全理解指南

基础类型完全理解指南

这是一个系列。 如果你是刚学 Rust,或者已经写了一段时间但总觉得「类型选得不踏实」, 那你来对地方了。

📚 本系列你将学到什么?

  • Rust 为什么逼你选类型
  • 各种类型什么时候该用,什么时候不该用
  • 如何通过类型系统,提前减少 bug

📌 本篇目标(第一篇)

“我知道 Rust 有这些类型”“我知道该怎么选这些类型”


〇、Rust 基础类型全景速览

新手第一原则:先看清全局,再钻细节

标量类型(Scalar Types)

  • 有符号整数i8 i16 i32 i64 i128 isize
  • 无符号整数u8 u16 u32 u64 u128 usize
  • 浮点数f32 f64
  • 字符char
  • 布尔值bool
  • 单元类型()

复合类型(Composite Types)

  • 数组[T; N]
  • 元组(T1, T2, ...)

一、Rust 的类型设计哲学(一句话先讲透)

Rust 的类型系统只做一件事:

逼你在写代码时,把“这个值的含义”想清楚。

不是为了多,而是为了准。


二、标量类型(Scalar Types)

Rust 的标量类型一览

  • 有符号整数i8 i16 i32 i64 i128 isize
  • 无符号整数u8 u16 u32 u64 u128 usize
  • 浮点数f32 f64
  • 字符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 会少一大半。