Rust str 与 String 类型的区别
文章目录1.核心对比2.代码示例3.内存布局4.相互转换5.一句话总结Rust 中String和str的核心区别在于String是拥有所有权的、可增长的堆分配字符串str是借用的、不可变的字符串切片通常以str形式出现。1.核心对比维度Stringstr通常写作str所有权拥有字符串数据借用不拥有存储位置堆heap通常在静态区或借用自String可变性可变可增长、修改不可变大小固定大小指针 长度 容量动态大小DST必须通过引用使用创建方式String::from(hello)、hello.to_string()s[..]、hello字面量能否修改✅ 可以push_str、push、insert等❌ 不可修改典型用途需要拥有和修改字符串时只读借用、函数参数、字符串字面量2.代码示例// String拥有所有权可修改letmutsString::from(hello);s.push_str( world);// ✅ 可以修改println!({},s);// 输出: hello world// str借用不可修改lets2:strhello;// 字符串字面量类型是 static str// s2.push_str( world); // ❌ 编译错误// 从 String 获取 strlets3String::from(hello);letslice:strs3[..];// 借用整个字符串letslice2:strs3;// 也可以直接这样3.内存布局String: ┌─────────┬────────┬────────┐ │ ptr │ len │ cap │ 栈上24 字节 └────┬────┴────────┴────────┘ │ ▼ ┌─────────────────────────────┐ │ h e l l o │ 堆上实际数据 └─────────────────────────────┘ str: ┌─────────┬────────┐ │ ptr │ len │ 栈上16 字节 └────┬────┴────────┘ │ ▼ ┌─────────────────────────────┐ │ h e l l o │ 可能在静态区、堆或栈上 └─────────────────────────────┘4.相互转换转换方式String→strs或s.as_str()str→Strings.to_string()或String::from(s)5.一句话总结String是拥有所有权的堆分配字符串可增长、可修改str是不可变的字符串切片通常以str借用形式使用用于只读场景。函数参数优先用str需要拥有和修改时用String。