文章目录0.前言1.核心定义2.字符串 slice 的两种常见来源3.String vs str4.示例代码5.切片索引注意事项6.为什么需要两种字符串类型7.总结参考文献0.前言在 Rust 中字符串 slicestr是一个对 UTF-8 编码的字符串数据段的不可变引用。它是 Rust 核心字符串类型之一用于在不拥有数据所有权的情况下高效地访问字符串的一部分或全部。1.核心定义语法str本质一个胖指针fat pointer包含两部分指向底层 UTF-8 字节序列的指针。字符串的长度单位是字节不是字符数。内存位置可以指向静态内存如字符串字面量、堆内存如String的某一部分或栈内存极少见。可变性不可变不能修改其指向的内容。2.字符串 slice 的两种常见来源来源示例说明字符串字面量let s: str Hello, world!;字面量类型是static str指向可执行文件的只读数据段。从String借用let s String::from(hello);let slice: str s;String实现了DerefTargetstr因此String可自动转换为str。从String切片let slice s[0..4];获取String中某一段字节的视图注意索引必须是 UTF-8 字符边界。3.String vs str特性Stringstr所有权拥有数据所有权借用数据无所有权内存位置堆可动态增长可指向静态内存、堆或栈的一部分可变性✅ 可修改如push_str❌ 不可变内部结构Vecu8指针、长度、容量胖指针指针、长度使用场景需要拥有、修改或传递字符串数据时需要只读访问字符串、函数参数等4.示例代码fnmain(){// 1. 字符串字面量static strlethello:strHello;// 指向静态内存// 2. 从 String 借用为 strletsString::from(world);letworld:strs;// 自动解引用强制转换// 3. 字符串 slice 切片从 String 中获取一部分letslice:strs[0..2];// wo取前两个字节println!(slice: {},slice);// 4. 字符串 slice 可以连接但需要转换为 Stringletcombinedformat!({} {},hello,world);println!({},combined);// Hello world}5.切片索引注意事项字符串 slice 的索引必须按字节来且必须落在 UTF-8 字符的边界上。否则程序会panic。lets你好;// let slice s[0..1]; // ❌ 运行时 panic因为 你 占 3 个字节索引 1 在字符中间letslices[0..3];// ✅ 你三字节println!({},slice);若需要按字符操作应使用.chars()方法。6.为什么需要两种字符串类型Rust 通过分离String拥有所有权的可变字符串和str借用的不可变视图实现了内存安全str的借用生命周期被编译器检查避免悬垂引用。零成本抽象字符串 slice 不会复制数据只创建视图。高效的 API 设计函数参数用str可以同时接受String和str无需额外转换。fngreet(name:str){println!(Hello, {}!,name);}fnmain(){letname1Alice;// strletname2String::from(Bob);// Stringgreet(name1);// ✅ 直接传 strgreet(name2);// ✅ 传 String自动转为 str}7.总结str是字符串的只读视图不拥有数据指向一段 UTF-8 编码的字节。字符串字面量的类型是static str。可通过String或s[start..end]获得str。它作为函数参数非常灵活是 Rust 字符串处理的首选类型。切片索引需按字节进行且必须位于字符边界。如果你希望进一步了解 UTF-8 编码边界和按字符操作的方法或是str类型与[u8]的异同我可以继续为你解释。参考文献Rust 程序设计语言中文版