欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2024年01月10日 10:33:17   作者:漁夫  
這篇文章主要為大家介紹了Rust切片與Go的區(qū)別探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Rust 中的切片

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

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

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

讓我們通過(guò)下面的代碼示例來(lái)具體分析這一概念,下面從 String 變量 s 創(chuàng)建了兩個(gè)切片 s1 和 s2

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é)果:

s = hello
s1 = hel
s2 = lo
len = 5
capacity = 5
Address of s: 0x7ffee307b650
Address of s1: 0x7f8d3ad02ab0
Address 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à)好的圖,忘記插入了,哈哈)

再打印出 s1 和 s2 的長(zhǎng)度:

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

可以看到切片取值情況

&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ù)的借用。

這種區(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ù)雜性。

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

以上就是探索Rust切片與Go有何區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于Rust Go切片區(qū)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 最新Rust錯(cuò)誤處理簡(jiǎn)介

    最新Rust錯(cuò)誤處理簡(jiǎn)介

    Rust并不像C++一樣使用try?catch的異常機(jī)制來(lái)進(jìn)行錯(cuò)誤處理,他將錯(cuò)誤分為可恢復(fù)錯(cuò)誤和不可恢復(fù)錯(cuò)誤兩類(lèi),主要使用panic!宏和Result<T,E>類(lèi)型來(lái)進(jìn)行錯(cuò)誤處理,這篇文章主要介紹了Rust錯(cuò)誤處理簡(jiǎn)介,需要的朋友可以參考下
    2022-11-11
  • 關(guān)于Rust編譯時(shí)報(bào)link.exe?not?found錯(cuò)誤問(wèn)題

    關(guān)于Rust編譯時(shí)報(bào)link.exe?not?found錯(cuò)誤問(wèn)題

    這篇文章主要介紹了Rust編譯的時(shí)候報(bào)出link.exe?not?found錯(cuò)誤問(wèn)題,解決方法是在命令行就是CMD執(zhí)行相應(yīng)的命令即可,本文給大家分解決方法,需要的朋友可以參考下
    2022-09-09
  • Rust中的引用與借用舉例詳解

    Rust中的引用與借用舉例詳解

    這篇文章主要給大家介紹了關(guān)于Rust中引用與借用的相關(guān)資料,rust中借用和引用的附帶功效都一樣,就是都有生命周期,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Rust具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-11-11
  • Rust中字符串類(lèi)型String的46種常用方法分享

    Rust中字符串類(lèi)型String的46種常用方法分享

    Rust主要有兩種類(lèi)型的字符串:&str和String,本文主要為大家介紹的是String類(lèi)型的字符串以及它常用的46種方法,感興趣的小伙伴可以了解一下
    2023-06-06
  • Rust處理錯(cuò)誤的實(shí)現(xiàn)方法

    Rust處理錯(cuò)誤的實(shí)現(xiàn)方法

    程序在運(yùn)行的過(guò)程中,總是會(huì)不可避免地產(chǎn)生錯(cuò)誤,而如何優(yōu)雅地解決錯(cuò)誤,也是語(yǔ)言的設(shè)計(jì)哲學(xué)之一。本文就來(lái)和大家來(lái)了Rust是如何處理錯(cuò)誤的,感興趣的可以了解一下
    2023-03-03
  • Rust遍歷 BinaryHeap的示例代碼

    Rust遍歷 BinaryHeap的示例代碼

    Rust 的 BinaryHeap 結(jié)構(gòu)體實(shí)現(xiàn)了迭代器接口,因此你可以遍歷它,如果你想要遍歷 BinaryHeap 中的所有元素,你可以使用 .into_iter() 方法將其轉(zhuǎn)換為迭代器,并遍歷其中的元素,本文通過(guò)實(shí)例介紹Rust遍歷 BinaryHeap的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2024-04-04
  • Rust中向量的學(xué)習(xí)筆記

    Rust中向量的學(xué)習(xí)筆記

    在Rust語(yǔ)言中,向量是一種動(dòng)態(tài)數(shù)組類(lèi)型,可以存儲(chǔ)相同類(lèi)型的元素,并且可以在運(yùn)行時(shí)改變大小,本文就來(lái)介紹一下Rust中向量,感興趣的可以了解一下
    2024-03-03
  • Rust之Substrate框架中Core詳解

    Rust之Substrate框架中Core詳解

    Substrate是一個(gè)用于構(gòu)建區(qū)塊鏈的開(kāi)發(fā)框架,它由Parity團(tuán)隊(duì)基于Rust語(yǔ)言開(kāi)發(fā)而成,是一個(gè)開(kāi)箱即用的區(qū)塊鏈構(gòu)造器,本文詳細(xì)介紹了Substrate框架中的Core,需要的朋友可以參考下
    2023-05-05
  • Rust for循環(huán)語(yǔ)法糖背后的API場(chǎng)景分析

    Rust for循環(huán)語(yǔ)法糖背后的API場(chǎng)景分析

    for語(yǔ)句是一種能確定循環(huán)次數(shù)的循環(huán),for 語(yǔ)句用于執(zhí)行代碼塊指定的次數(shù),今天通過(guò)本文給大家介紹Rust for循環(huán)語(yǔ)法糖背后的API場(chǎng)景分析,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • Rust 中判斷兩個(gè) HashMap 是否相等

    Rust 中判斷兩個(gè) HashMap 是否相等

    在Rust標(biāo)準(zhǔn)庫(kù)中,HashMap 實(shí)現(xiàn)了 PartialEq 和 Eq trait,但是這些trait的實(shí)現(xiàn)是基于嚴(yán)格的結(jié)構(gòu)相等性,包括元素的順序,這篇文章主要介紹了Rust 中判斷兩個(gè) HashMap 是否相等,需要的朋友可以參考下
    2024-04-04

最新評(píng)論