尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

rust中,str 和 String有什么区别和联系?

rust中,str 和 String有什么区别和联系?
📅 发布时间:2026/6/18 3:24:06

在 Rust 中,&str 和 String 都用于处理文本,但它们在内存布局、所有权语义、使用场景上有本质区别。理解它们的差异是掌握 Rust 字符串处理的关键。


一、核心区别概览

特性 &str String
类型 字符串切片(引用类型) 可变、可增长的字符串(拥有所有权的堆分配类型)
内存位置 指向已有字符串数据(栈、堆、或静态存储) 数据存储在堆上
可变性 不可变(&str 是只读引用) 可变(可通过 push, push_str, insert 等修改)
生命周期 有生命周期(如 &'a str),依赖所引用数据的存活时间 自包含,拥有自己的数据,无生命周期参数
大小 固定大小(2 个字长:指针 + 长度) 动态大小(栈上存指针、长度、容量;堆上存实际字节)
是否可增长 ❌ 不能修改或增长 ✅ 可动态增长(类似 Vec<u8>)
如何创建 字符串字面量、从 String 借用、切片操作 String::new(), String::from("..."), "...".to_string()

二、详细解释

1. &str:字符串切片(String Slice)

  • 是一个不可变的 UTF-8 字节序列的引用
  • 类似于 &[u8],但保证是合法 UTF-8
  • 最常见的形式是字符串字面量,其类型为 &'static str(生命周期为 'static)
let s1: &str = "hello"; // 字符串字面量,'static 生命周期
let s2: &str = &"world"; // 等价
  • 也可以从 String 借用得到:
let owned = String::from("Rust");
let slice: &str = &owned; // 借用 String 的内容

✅ &str 是视图(view),不拥有数据,只“看”数据。


2. String:堆分配的拥有型字符串

  • 是 Vec<u8> 的 UTF-8 封装,拥有其数据
  • 可在运行时动态增长、修改
  • 通过 String::from、to_string()、format! 等创建
let mut s = String::from("Hello");
s.push_str(", world!"); // 修改
s.push('!');            // 添加字符
println!("{}", s);      // "Hello, world!!"

✅ String 是所有者(owner),负责管理堆内存。


三、联系与转换

1. String → &str(免费、安全)

通过借用(Deref 强制转换):

let s = String::from("hello");
let slice: &str = &s;        // 显式借用
// 或直接传递给接受 &str 的函数:
fn print_str(x: &str) { println!("{}", x); }
print_str(&s);               // 自动 Deref 转换

💡 Rust 会自动将 &String 转换为 &str(因为 String 实现了 Deref<Target = str>)。


2. &str → String(需要分配内存)

通过克隆数据到堆上:

let slice = "hello";
let owned: String = slice.to_string();     // 方法1
let owned2: String = String::from(slice);  // 方法2
let owned3: String = slice.into();         // 方法3(利用 From<&str> for String)

⚠️ 这个过程涉及堆内存分配和字节拷贝,有运行时开销。


四、使用建议(最佳实践)

场景 推荐类型
函数参数(只读) 用 &str(更通用,接受字面量和 String)
需要修改或所有权 用 String
返回新字符串 返回 String
存储字符串 根据是否需要所有权选择:
- 不需要修改/共享 → &'static str(如配置常量)
- 需要拥有数据 → String

示例:函数设计

// ✅ 好:接受 &str,兼容字面量和 String
fn greet(name: &str) {println!("Hello, {}!", name);
}greet("Alice");           // 字面量 OK
greet(&my_string);        // String 借用 OK// ❌ 不推荐:强制调用者必须提供 String
fn greet_bad(name: String) { ... }

五、内存布局图示

&str:┌──────────────┐│ 指针 → "hello"(可能在静态区、栈或堆) ││ 长度 = 5     │└──────────────┘String:┌──────────────┐│ 指针 → 堆 [h, e, l, l, o] ││ 长度 = 5     ││ 容量 = 5     │└──────────────┘

六、总结

对比项 &str String
角色 视图(View) 所有者(Owner)
内存 不分配新内存 堆分配
可变 ❌ ✅
通用性 高(函数参数首选) 低(但功能强)
转换 String → &str:免费
&str → String:需分配

✅ 记住:

  • “切片看,String 拥有”
  • 函数参数用 &str,返回新字符串用 String
  • 字面量是 &'static str

理解 &str 与 String 的区别,是写出高效、安全、惯用 Rust 代码的重要一步。

相关新闻

  • 安全测试左移的实施方案与效益分析
  • 揭秘Open-AutoGLM远程管控黑科技:如何实现毫秒级设备响应与零故障运行
  • 生成引擎优化(GEO)助力内容创作与用户体验协同提升的新方法

最新新闻

  • 2026 石家庄高端婚恋推荐榜 TOP1|将爱婚恋:燕赵纸媒背书,本地精英本硕博专属严选平台 - 星际AI
  • 2026 年招标智能清标工具客观测试与高合规使用指南 - 资讯纵览
  • 上班族在职备考法考:四大热门APP实测,哪款能帮你充分利用碎片时间 - 信息热点
  • Pandas多维聚合五大生产级模式:跨列异构、自定义函数、滚动窗口、扩展计算与语义重塑
  • 固安睛睿眼镜深耕视光二十载 全品类配镜一站式门店深度解读 联系电话:183336301983 地址:河北省廊坊市固安县固安镇新昌街凤凰城小区37号楼一单元1601 - 资讯纵览
  • 2026年 上海工程监理服务/工程造价咨询/全过程项目管理公司推荐:专业严谨与高效透明的最新口碑之选 - 品牌发掘

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号