当前位置:首页 > 科技  > 软件

Rust 切片与 Go 有何区别?

来源: 责编: 时间:2024-01-10 09:35:49 298观看
导读大家好,我是渔夫。今天,让我们一起深入学习 Rust 中的切片。在 Rust 编程语言中,除了常见的 String 类型,还有一种重要的字符串类型:str。这种类型通常被称为字符串切片(slice)。字符串切片可以理解为对一个字符串的部分或全

大家好,我是渔夫。nS928资讯网——每日最新资讯28at.com

今天,让我们一起深入学习 Rust 中的切片。在 Rust 编程语言中,除了常见的 String 类型,还有一种重要的字符串类型:str。这种类型通常被称为字符串切片(slice)。nS928资讯网——每日最新资讯28at.com

nS928资讯网——每日最新资讯28at.com

字符串切片可以理解为对一个字符串的部分或全部的引用。这意味着切片可以有任意长度,它的灵活性在某种程度上与 Golang 语言中的切片相似。nS928资讯网——每日最新资讯28at.com

当我们谈论切片的引用时,实际上我们是在引用一种特殊的指针,通常称为“胖指针”。这个指针不仅包含了对数据的引用,还包含了切片的长度信息。nS928资讯网——每日最新资讯28at.com

让我们通过下面的代码示例来具体分析这一概念,下面从 String 变量 s 创建了两个切片 s1 和 s2:nS928资讯网——每日最新资讯28at.com

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());}

运行结果:nS928资讯网——每日最新资讯28at.com

s = hellos1 = hels2 = lolen = 5capacity = 5Address of s: 0x7ffee307b650Address of s1: 0x7f8d3ad02ab0Address of s2: 0x7f8d3ad02ab3

从例子中,可以观察到 s1 和 s2  其实都是s 字符串的切片,是 s 的部分引用,意思就是相当于借用了 s 的部分内存空间。观察这些变量的长度、容量和内存地址揭示了它们之间的关系:尽管 s1 和 s2 有不同的内存地址,但它们是从同一原始字符串 s 中派生出来的。(画好的图,忘记插入了,哈哈)nS928资讯网——每日最新资讯28at.com

再打印出 s1 和 s2 的长度:nS928资讯网——每日最新资讯28at.com

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

可以看到切片取值情况:nS928资讯网——每日最新资讯28at.com

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

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

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

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

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

本文链接:http://www.28at.com/showinfo-26-59673-0.htmlRust 切片与 Go 有何区别?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 全球汽车配置器开发商生态圈采用 NVIDIA Omniverse

下一篇: 基础不牢地动山摇——shell中的变量和参数如何定义和使用?有什么注意点

标签:
  • 热门焦点
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库:让你的应用更亲民友好,实现视频通话无痛接入! 除了基本用法外,还有一些进阶用法可以更好地利用该库。自定义 STUN/TURN 服务器配置WebRTC.Net 默认使用 Google 的
  • 得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的&ldquo;在线鉴别&rdquo;,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 机构称Q2国内智能手机销量同比下滑4% vivo份额重回第1

    7月29日消息,根据市场调查机构Counterpoint Research公布的最新报告,2023年第2季度中国智能手机销量同比下降4%,创新自2014年以来第2季度销量新低。报
Top