日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

Rust 切片與 Go 有何區(qū)別?

來(lái)源: 責(zé)編: 時(shí)間:2024-01-10 09:35:49 207觀看
導(dǎo)讀大家好,我是漁夫。今天,讓我們一起深入學(xué)習(xí) Rust 中的切片。在 Rust 編程語(yǔ)言中,除了常見(jiàn)的 String 類(lèi)型,還有一種重要的字符串類(lèi)型:str。這種類(lèi)型通常被稱(chēng)為字符串切片(slice)。字符串切片可以理解為對(duì)一個(gè)字符串的部分或全

大家好,我是漁夫。MuJ28資訊網(wǎng)——每日最新資訊28at.com

今天,讓我們一起深入學(xué)習(xí) Rust 中的切片。在 Rust 編程語(yǔ)言中,除了常見(jiàn)的 String 類(lèi)型,還有一種重要的字符串類(lèi)型:str。這種類(lèi)型通常被稱(chēng)為字符串切片(slice)。MuJ28資訊網(wǎng)——每日最新資訊28at.com

MuJ28資訊網(wǎng)——每日最新資訊28at.com

字符串切片可以理解為對(duì)一個(gè)字符串的部分或全部的引用。這意味著切片可以有任意長(zhǎng)度,它的靈活性在某種程度上與 Golang 語(yǔ)言中的切片相似。MuJ28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)我們談?wù)撉衅囊脮r(shí),實(shí)際上我們是在引用一種特殊的指針,通常稱(chēng)為“胖指針”。這個(gè)指針不僅包含了對(duì)數(shù)據(jù)的引用,還包含了切片的長(zhǎng)度信息。MuJ28資訊網(wǎng)——每日最新資訊28at.com

讓我們通過(guò)下面的代碼示例來(lái)具體分析這一概念,下面從 String 變量 s 創(chuàng)建了兩個(gè)切片 s1 和 s2:MuJ28資訊網(wǎng)——每日最新資訊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);    // 長(zhǎng)度和容量    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());}

運(yùn)行結(jié)果:MuJ28資訊網(wǎng)——每日最新資訊28at.com

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

從例子中,可以觀察到 s1 和 s2  其實(shí)都是s 字符串的切片,是 s 的部分引用,意思就是相當(dāng)于借用了 s 的部分內(nèi)存空間。觀察這些變量的長(zhǎng)度、容量和內(nèi)存地址揭示了它們之間的關(guān)系:盡管 s1 和 s2 有不同的內(nèi)存地址,但它們是從同一原始字符串 s 中派生出來(lái)的。(畫(huà)好的圖,忘記插入了,哈哈)MuJ28資訊網(wǎng)——每日最新資訊28at.com

再打印出 s1 和 s2 的長(zhǎng)度:MuJ28資訊網(wǎng)——每日最新資訊28at.com

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

可以看到切片取值情況:MuJ28資訊網(wǎng)——每日最新資訊28at.com

  • &s1:截取從索引 0 到 索引 3
  • &s2:從索引 3 開(kāi)始到索引 5 結(jié)束

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

Go 和 Rust 使用“切片”這個(gè)詞描述不同的概念。在 Go 中,切片結(jié)構(gòu)體既包含長(zhǎng)度信息也包含容量信息,它既可以擴(kuò)展也可以作為現(xiàn)有切片的引用,而無(wú)需擔(dān)心所有權(quán)和生命周期。Rust 則將這些功能分離:Vec<T> 是一個(gè)可增長(zhǎng)的容器,擁有其數(shù)據(jù)的所有權(quán);而 &[T] 是一個(gè)固定大小的切片,只是一個(gè)指向數(shù)據(jù)的借用。MuJ28資訊網(wǎng)——每日最新資訊28at.com

這種區(qū)別反映了 Rust 的所有權(quán)原則,這在無(wú)GC語(yǔ)言語(yǔ)境下提供了內(nèi)存安全保障。在 Rust 中,所有權(quán)、借用和生命周期的概念是核心特性,因此 Vec 和切片必須是兩種不同的類(lèi)型。相反,Go 的類(lèi)型系統(tǒng)不強(qiáng)制執(zhí)行這些概念,因?yàn)樗蕾?lài)于垃圾收集器來(lái)管理內(nèi)存。雖然這在概念上似乎更簡(jiǎn)單,但它也隱藏了潛在的內(nèi)存管理復(fù)雜性。MuJ28資訊網(wǎng)——每日最新資訊28at.com

Rust 之所以將 Go 中的單一切片類(lèi)型分成 Vec 和切片兩種,是為了提供更明確的內(nèi)存管理語(yǔ)義,減少引用計(jì)數(shù)導(dǎo)致的性能開(kāi)銷(xiāo)。這些設(shè)計(jì)決策與 Rust 的目標(biāo)一致,即提供零成本抽象和更細(xì)粒度的內(nèi)存控制。MuJ28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-59673-0.htmlRust 切片與 Go 有何區(qū)別?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 全球汽車(chē)配置器開(kāi)發(fā)商生態(tài)圈采用 NVIDIA Omniverse

下一篇: 基礎(chǔ)不牢地動(dòng)山搖——shell中的變量和參數(shù)如何定義和使用?有什么注意點(diǎn)

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top 主站蜘蛛池模板: 乌鲁木齐县| 嫩江县| 临沂市| 望江县| 称多县| 贡嘎县| 久治县| 东光县| 织金县| 南靖县| 军事| 宜兴市| 灯塔市| 从江县| 工布江达县| 兴宁市| 南华县| 泗洪县| 岳池县| 恭城| 勃利县| 阳新县| 革吉县| 阳东县| 蓬溪县| 黎平县| 天峨县| 谢通门县| 乌拉特前旗| 连山| 五原县| 海门市| 融水| 兴国县| 阳高县| 三亚市| 延安市| 邵东县| 尚义县| 乐山市| 陇南市|