主题
面试级 Rust 类型选型问答(一次把坑填平)
这些问题,基本覆盖了 Rust 初 / 中级面试 80% 的类型选型考点。
Q1:Rust 的标量类型有哪些?为什么要区分?
答:
Rust 的标量类型包括:
- 有符号整数:
i8 i16 i32 i64 i128 isize - 无符号整数:
u8 u16 u32 u64 u128 usize - 浮点数:
f32 f64 - 布尔值:
bool - 字符:
char - 单元类型:
()
设计目的:
用类型本身表达“值的语义”,而不是只表示“能装多少数据”。
Q2:为什么默认推荐用 i32?
答:
- 大多数 CPU 对 32 位整数优化最好
- 覆盖绝大部分业务范围
- 内存、性能、可读性平衡最好
👉 经验法则:
不确定 →
i32
Q3:i16 / i32 / i64 / i128 分别什么时候用?
有符号整数使用场景
| 类型 | 典型场景 |
|---|---|
i16 | 网络协议字段、小范围数值、嵌入式 |
i32 | 默认业务数值(最常用) |
i64 | 时间戳、数据库 ID、文件大小 |
i128 | 金融金额、加密算法、大整数计算 |
rust
let timestamp: i64 = 1_706_000_000;Q4:u16 / u32 / u64 / u128 呢?
无符号整数使用场景
| 类型 | 典型场景 |
|---|---|
u16 | 端口号、协议长度字段 |
u32 | 计数器、哈希值、IPv4 |
u64 | 文件大小、对象数量 |
u128 | UUID、哈希、加密相关 |
rust
let port: u16 = 8080;Q5:usize 和 u64 有什么本质区别?
答:
| 对比 | usize | u64 |
|---|---|---|
| 语义 | 内存相关 | 纯数值 |
| 位数 | 跟平台 | 固定 64 |
| 用途 | 索引 / 长度 | 业务数据 |
👉 结论:
索引 / 长度 / size →
usize数据 / 数量 →
u64
Q6:什么时候用 isize?
答:
- 指针偏移
- 相对位移
- 底层 / unsafe 场景
rust
let offset: isize = -1;👉 普通业务中 几乎不用。
Q7:char 为什么是 4 字节?
答:
因为 Rust 的 char 表示:
一个 Unicode 标量值
而不是:
- ASCII
- UTF-8 字节
rust
let c: char = '你';
let e: char = '😂';Q8:为什么字符串要分 &str 和 String?
答:
| 类型 | 含义 |
|---|---|
&str | 借用的字符串视图 |
String | 拥有数据的字符串 |
👉 核心判断:
要不要改?要不要存? 要 →
String不要 →&str
Q9:为什么函数参数常用 &str?
答:
rust
fn greet(name: &str) {}因为这样:
- 不强迫分配
- 接受
&str和String - 更通用、更高性能
Q10:const 和 static 怎么选?
答:
| 场景 | 选型 |
|---|---|
| 编译期常量 | const |
| 配置值 | const |
| 全局只读数据 | static |
| 需要固定地址 | static |
👉 90% 场景用 const。
最终一句话(面试收尾)
Rust 的类型系统不是为了复杂, 而是为了让错误在编译期暴露,语义在代码中显性表达。