Rust 切片与Go 有何区别?

news/2024/11/23 9:39:18/

大家好,我是渔夫。

今天,让我们一起深入学习 Rust 中的切片。在 Rust 编程语言中,除了常见的 String 类型,还有一种重要的字符串类型:str。这种类型通常被称为字符串切片(slice)。

字符串切片可以理解为对一个字符串的部分或全部的引用。这意味着切片可以有任意长度,它的灵活性在某种程度上与 Golang 语言中的切片相似。

当我们谈论切片的引用时,实际上我们是在引用一种特殊的指针,通常称为“胖指针”。这个指针不仅包含了对数据的引用,还包含了切片的长度信息。

让我们通过下面的代码示例来具体分析这一概念,下面从 String 变量 s 创建了两个切片 s1s2

fn main() {let s = String::from("hello");let s1: &str = &s[0..3];let s2: &str = &s[3..s.len()];// 打印出值println!("s = {}", s);println!("s1 = {}", s1);println!("s2 = {}", s2);// 长度和容量println!("len = {}", s.len());println!("capacity = {}", s.capacity());// 地址println!("Address of s: {:p}", &s);println!("Address of s1: {:p}", s1.as_ptr());println!("Address of s2: {:p}", s2.as_ptr());
}

运行结果:

s = hello
s1 = hel
s2 = lo
len = 5
capacity = 5
Address of s: 0x7ffee307b650
Address of s1: 0x7f8d3ad02ab0
Address of s2: 0x7f8d3ad02ab3

从例子中,可以观察到 s1s2 其实都是s 字符串的切片,是 s 的部分引用,意思就是相当于借用了 s 的部分内存空间。观察这些变量的长度、容量和内存地址揭示了它们之间的关系:尽管 s1s2 有不同的内存地址,但它们是从同一原始字符串 s 中派生出来的。

在这里插入图片描述

再打印出 s1 和 s2 的长度:

println!("len = {}", s1.len()); // 3
println!("len = {}", s2.len()); // 2

可以看到切片取值情况

  • &s1:截取从索引 0 到 索引 3
  • &s2:从索引 3 开始到索引 5 结束

Go 切片 和 Rust 切片有什么不同

Go 和 Rust 使用“切片”这个词描述不同的概念。在 Go 中,切片结构体既包含长度信息也包含容量信息,它既可以扩展也可以作为现有切片的引用,而无需担心所有权和生命周期。Rust 则将这些功能分离:Vec<T> 是一个可增长的容器,拥有其数据的所有权;而 &[T] 是一个固定大小的切片,只是一个指向数据的借用。

这种区别反映了 Rust 的所有权原则,这在无GC语言语境下提供了内存安全保障。在 Rust 中,所有权、借用和生命周期的概念是核心特性,因此 Vec 和切片必须是两种不同的类型。相反,Go 的类型系统不强制执行这些概念,因为它依赖于垃圾收集器来管理内存。虽然这在概念上似乎更简单,但它也隐藏了潜在的内存管理复杂性。

Rust 之所以将 Go 中的单一切片类型分成 Vec 和切片两种,是为了提供更明确的内存管理语义,减少引用计数导致的性能开销。这些设计决策与 Rust 的目标一致,即提供零成本抽象和更细粒度的内存控制。

我是渔夫,现在在国内某某云程序员,业余独立开发者,探索副业,生活、技术、非科班转码经验等相关文章,欢迎关注,和渔夫一起成长。


http://www.ppmy.cn/news/1296461.html

相关文章

【QML COOK】- 002-添加一个图片

1. 编辑main.qml import QtQuickWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")Image {anchors.fill: parentsource: "qrc:/Resources/Images/arrow.png"} }将Window的width和height都改成800&#xff0c;因为我们要添加的图片大…

进程和计划任务

1. 什么是程序&#xff1a;执行特定任务的一串代码 什么是进程&#xff1a;加载到内存中运行 进程ID&#xff08;Process ID&#xff0c;PID&#xff09;号码被用来标记各个进程 UID、GID语境决定对文件系统的存取和访问权限 通常从执行进程的用户来继承 存在生命周期 都由其…

解压方法之一 tar

文章目录 解压方法之一 tar语法压缩文件查看压缩文件的内容解压文件更多信息 解压方法之一 tar … note:: 十年磨一剑&#xff0c;霜刃未曾试。 贾岛《剑客 / 述剑》 Linux的tar命令可以用来压缩或者解压缩文件。 官方定义为&#xff1a; tar - an archiving utility 语法 …

android启动流程

BootROM 这个固化在rom里 Bootloader 启动kernel前的准备工作&#xff0c;包括正常启动与recovery&#xff0c;烧写等不同做出判断 启动kernel会传些参数 重点是android启动流程 1. 驱动加载 比如usb, light, audio, camera, bt, wifi等 2. init 见system/core/init/init.c…

URL编码揭秘:为什么要进行URL编码?

URL&#xff08;Uniform Resource Locator&#xff0c;统一资源定位符&#xff09;是互联网上资源地址的唯一标识符。在网络请求和数据传输过程中&#xff0c;URL编码起着至关重要的作用。 URL编码解码 | 一个覆盖广泛主题工具的高效在线平台(amd794.com) https://amd794.com…

Educational Codeforces Round 154 (Rated for Div. 2) (VP-8,寒假加训)

VP时间 A. 这个字符串所表示是数字为质数 17&#xff0c;71 wa2发 3.ac B. 看一个数字是什么&#xff08;是0&#xff09; 开始遍历找到最后一个0 这块区域肯定可以一样 然后比较后面的 000101 010111 这例子可以说明应该枚举0&#xff0c;1之间然后让模拟一下 如…

CPU算力分配(100用例)C卷 (JavaPythonC语言C++Node.js)

现有两组服务器A和B,每组有多个算力不同的CPU,其中A[i]是A组第i个CPU的运算能力,B[i]是B组第i个CPU的运算能力,一组服务器的总算力是各CPU的算力之和。 为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换,求两组服务器中,用于交换的CPU的算力,并且要求从…

MySQL将多条数据合并成一条的完整示例

数据库中存的是多条数据&#xff0c;展示的时候需要合并成一条 数据表存储形式如下图 以type分组&#xff0c;type相同的算一条&#xff0c;且保留image和link的所有数据&#xff0c;用groupBy只保留一条数据 解决方案&#xff1a;用GROUP_CONCAT 完整语法如下 group_concat…