Rust str 与 String 类型的区别

文章目录

Rust 中 String 和 str 的核心区别在于: String 是拥有所有权的、可增长的堆分配字符串;str 是借用的、不可变的字符串切片,通常以 &str 形式出现。

1.核心对比

维度 String str (通常写作 &str)
所有权 拥有字符串数据 借用(不拥有)
存储位置 堆(heap) 通常在静态区或借用自 String
可变性 可变,可增长、修改 不可变
大小 固定大小(指针 + 长度 + 容量) 动态大小(DST),必须通过引用使用
创建方式 String::from("hello")、"hello".to_string() &s[..]、"hello"(字面量)
能否修改 ✅ 可以 push_str、push、insert 等 ❌ 不可修改
典型用途 需要拥有和修改字符串时 只读借用、函数参数、字符串字面量

2.代码示例

rust 复制代码
// String:拥有所有权,可修改
let mut s = String::from("hello");
s.push_str(" world");  // ✅ 可以修改
println!("{}", s);     // 输出: hello world

// &str:借用,不可修改
let s2: &str = "hello";  // 字符串字面量,类型是 &'static str
// s2.push_str(" world");  // ❌ 编译错误

// 从 String 获取 &str
let s3 = String::from("hello");
let slice: &str = &s3[..];  // 借用整个字符串
let slice2: &str = &s3;     // 也可以直接这样

3.内存布局

复制代码
String:
┌─────────┬────────┬────────┐
│  ptr    │  len   │  cap   │  (栈上,24 字节)
└────┬────┴────────┴────────┘
     │
     ▼
┌─────────────────────────────┐
│  h  e  l  l  o              │  (堆上,实际数据)
└─────────────────────────────┘

&str:
┌─────────┬────────┐
│  ptr    │  len   │  (栈上,16 字节)
└────┬────┴────────┘
     │
     ▼
┌─────────────────────────────┐
│  h  e  l  l  o              │  (可能在静态区、堆或栈上)
└─────────────────────────────┘

4.相互转换

转换 方式
String → &str &s 或 s.as_str()
&str → String s.to_string() 或 String::from(s)

5.一句话总结

String 是拥有所有权的堆分配字符串,可增长、可修改;str 是不可变的字符串切片,通常以 &str 借用形式使用,用于只读场景。函数参数优先用 &str,需要拥有和修改时用 String。

相关推荐
miofly3 小时前
GitHub 今日推荐|fsearch:Rust 打造 macOS 毫秒级全盘文件名与内容搜索工具
rust·开源·github
大鹏的NLP博客4 小时前
Rust 的本质:用数学约束实现编译期内存安全
安全·rust
Kapaseker4 小时前
Rust 读多写少还在用 Mutex?别让线程白白排队
rust
EatFan5 小时前
2026 Rust 后端技术栈选型:Axum 0.8 + Tokio + SQLx 全链路怎么搭
开发语言·后端·rust·tokio·serde·axum·sqlx
Zoom15 小时前
【开源】7 天,我用 Rust 复刻了 FinalShell!Rhost v1.0.0 发布
rust·electron·shell
wflynn19 小时前
GitHub 今日推荐|ts-rust:把微软 TypeScript-Go 编译器逐行移植成 Rust 实现
rust·typescript·开源·github·compiler·tsc
miofly20 小时前
GitHub 今日推荐|wordcraft:用 Rust 重写 Word 内核并开放给 AI 调用
rust·开源·github
Amos_Web20 小时前
Rspack 源码解析(十八):Tree Shaking 如何用 SideEffects 重写模块连接
前端·rust·前端框架
Source.Liu1 天前
【A11】Tauri v2 + 原生前端(无框架)项目笔记:从零到登录界面
rust