0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Go切片的內(nèi)部實(shí)現(xiàn)

麥辣雞腿堡 ? 來(lái)源:盼盼編程 ? 作者:盼盼編程 ? 2023-10-09 09:43 ? 次閱讀

切片

Go中提供了一種靈活,功能強(qiáng)悍的內(nèi)置類(lèi)型Slices切片(“動(dòng)態(tài)數(shù)組"),與數(shù)組相比切片的長(zhǎng)度是不固定的,可以追加元素,在追加時(shí)可能使切片的容量增大。

切片中有兩個(gè)概念:一是len長(zhǎng)度,二是cap容量,長(zhǎng)度是指已經(jīng)被賦過(guò)值的最大下標(biāo)+1,可通過(guò)內(nèi)置函數(shù)len()獲得。

容量是指切片目前可容納的最多元素個(gè)數(shù),可通過(guò)內(nèi)置函數(shù)cap()獲得。切片是引用類(lèi)型,因此在當(dāng)傳遞切片時(shí)將引用同一指針,修改值將會(huì)影響其他的對(duì)象。

s := []int {1,2,3 }            //直接初始化切片

s := arr[:]                    //用數(shù)組初始化切片

s = make([]int, 3)             //make初始化,有3個(gè)元素的切片, len和cap都為3

s = make([]int, 2, 3)          //make初始化,有2個(gè)元素的切片, len為2, cap為3

a = append(a, 1)               // 追加1個(gè)元素

a = append(a, 1, 2, 3)         // 追加多個(gè)元素, 手寫(xiě)解包方式

a = append(a, []int{1,2,3}...) // 追加一個(gè)切片, 切片需要解包

不過(guò)要注意的是,在容量不足的情況下,append的操作會(huì)導(dǎo)致重新分配內(nèi)存,可能導(dǎo)致巨大的內(nèi)存分配和復(fù)制數(shù)據(jù)代價(jià)。

a = append([]int{0}, a...) 切片頭部添加元素。在開(kāi)頭一般都會(huì)導(dǎo)致內(nèi)存的重新分配,而且會(huì)導(dǎo)致已有的元素全部復(fù)制1次。

因此,從切片的開(kāi)頭添加元素的性能一般要比從尾部追加元素的性能差很多。

//切片是地址傳遞
func updateSlice(a []int) {
     a[0] = 3
}

func main() {
     //切片
     var a = []int{1, 2, 3}
     c := make([]int, 5)
     copy(c, a)

     updateSlice(c)
     fmt.Println(c)
}
打印
[3 2 3 0 0]

切片的內(nèi)部實(shí)現(xiàn)

切片是一個(gè)很小的對(duì)象,它對(duì)底層的數(shù)組(內(nèi)部是通過(guò)數(shù)組保存數(shù)據(jù)的)進(jìn)行了抽象,并提供相關(guān)的操作方法。

切片是一個(gè)有三個(gè)字段的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)包含 Golang 需要操作底層數(shù)組的元數(shù)據(jù):

圖片

這 3 個(gè)字段分別是指向底層數(shù)組的指針、切片訪問(wèn)的元素的個(gè)數(shù)(即長(zhǎng)度)和切片允許增長(zhǎng)到的元素個(gè)數(shù)(即容量)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    568

    瀏覽量

    40030
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    411

    瀏覽量

    25821
  • 切片
    +關(guān)注

    關(guān)注

    1

    文章

    22

    瀏覽量

    8433
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    #硬聲創(chuàng)作季 Go核心編程_使用切片的區(qū)別分析

    編程語(yǔ)言go語(yǔ)言
    Mr_haohao
    發(fā)布于 :2022年09月11日 18:05:54

    請(qǐng)問(wèn)BGA封裝如何切片?

    請(qǐng)問(wèn)BGA封裝如何切片?是帶芯片一起切片用顯微鏡觀察錫球情況嗎?是否有自動(dòng)切片,精度如何?有看到板廠給的異常板切片報(bào)告說(shuō)手工切片具有不確定性
    發(fā)表于 12-04 22:06

    怎么獲得不同F(xiàn)PGA系列的等效切片計(jì)數(shù)

    大家好,我在Artix-7設(shè)備上實(shí)現(xiàn)了一個(gè)圖像處理系統(tǒng)。我通過(guò)使用ISE工具生成的發(fā)布位置和路徑報(bào)告,根據(jù)占用的切片計(jì)算了設(shè)計(jì)的資源消耗?,F(xiàn)在我需要將我設(shè)計(jì)的資源消耗(占用切片)與其他一些設(shè)計(jì)進(jìn)行
    發(fā)表于 04-29 13:40

    如何實(shí)現(xiàn)一個(gè)使用V5上至少80%可用切片的設(shè)計(jì)

    你好,我必須實(shí)現(xiàn)一個(gè)使用V5上至少80%可用切片的設(shè)計(jì)。實(shí)現(xiàn)它的最佳方法是什么?是否有可用的示例設(shè)計(jì)使用80%或更多的邏輯?切片數(shù)量切片LU
    發(fā)表于 06-17 14:22

    芯片漏電點(diǎn)FIB切片分析

    失效分析,很多時(shí)候都需要做FIB-SEM測(cè)試,相信各位電子行業(yè)的朋友并不陌生, 大家都知道用聚焦離子束FIB切片芯片,解剖芯片內(nèi)部結(jié)構(gòu) 查找芯片失效點(diǎn)分析,再做進(jìn)一步分析。今天,邵工給大家分享一下
    發(fā)表于 08-05 12:11

    PCB切片的分類(lèi)及作用介紹

    切片分析主要用于檢查PCB內(nèi)部走線厚度、層數(shù),通孔孔徑大小,通孔質(zhì)量觀察,用于檢查PCBA焊點(diǎn)內(nèi)部空洞,界面結(jié)合狀況,潤(rùn)濕質(zhì)量評(píng)價(jià)等等。切片分析是進(jìn)行PCB/PCBA失效分析的重要技術(shù)
    的頭像 發(fā)表于 05-17 14:53 ?1w次閱讀

    dubbo-go 中的 TPS Limit 設(shè)計(jì)與實(shí)現(xiàn)

    則是 Dubbo 的 Go 語(yǔ)言實(shí)現(xiàn)。 最近在 dubbo-go 的 todo list 上發(fā)現(xiàn),它還沒(méi)有實(shí)現(xiàn) TPS Limit 的模塊,于是就抽空
    發(fā)表于 03-17 15:27 ?582次閱讀

    中國(guó)移完成了DNN在內(nèi)的完整切片以及多種智能終端切片設(shè)計(jì)實(shí)現(xiàn)方案

    切片白皮書(shū)》。白皮書(shū)發(fā)布旨在匯聚產(chǎn)業(yè)各方資源,共商提速5G切片端到端商用推進(jìn)計(jì)劃,早日實(shí)現(xiàn)5G切片規(guī)模商用,最終實(shí)現(xiàn)5G產(chǎn)業(yè)與個(gè)人消費(fèi)領(lǐng)域、
    的頭像 發(fā)表于 10-16 10:27 ?4014次閱讀

    網(wǎng)絡(luò)切片的分類(lèi) 網(wǎng)絡(luò)切片粒度如何選擇

    網(wǎng)絡(luò)切片是一種按需組網(wǎng)的方式,可以讓運(yùn)營(yíng)商在統(tǒng)一的基礎(chǔ)設(shè)施上分離出多個(gè)虛擬的端到端網(wǎng)絡(luò),每個(gè)網(wǎng)絡(luò)切片從無(wú)線接入網(wǎng)承載網(wǎng)再到核心網(wǎng)上進(jìn)行邏輯隔離,以適配各種各樣類(lèi)型的應(yīng)用。 網(wǎng)絡(luò)切片的分類(lèi) 1、獨(dú)立
    的頭像 發(fā)表于 09-03 17:01 ?3476次閱讀

    PCB電路板切片的分析

    目的:? 電路板品質(zhì)的好壞、問(wèn)題的發(fā)生與解決、制程改進(jìn)的評(píng)估,在都需要切片做為客觀檢查、研究與判斷的根據(jù)。切片質(zhì)量的好壞,對(duì)結(jié)果的判定影響很大。? 切片分析主要用于檢查PCB內(nèi)部走線厚
    發(fā)表于 10-19 15:28 ?9398次閱讀
    PCB電路板<b class='flag-5'>切片</b>的分析

    Go并發(fā)模型的實(shí)現(xiàn)原理

    Go語(yǔ)言是為并發(fā)而生的語(yǔ)言,Go語(yǔ)言是為數(shù)不多的在語(yǔ)言層面實(shí)現(xiàn)并發(fā)的語(yǔ)言;也正是Go語(yǔ)言的并發(fā)特性,吸引了全球無(wú)數(shù)的開(kāi)發(fā)者。
    的頭像 發(fā)表于 04-15 08:49 ?1269次閱讀

    朋也社區(qū)Go版本Go實(shí)現(xiàn)的社區(qū)系統(tǒng)

    ./oschina_soft/pybbs-go.zip
    發(fā)表于 06-10 14:32 ?0次下載
    朋也社區(qū)<b class='flag-5'>Go</b>版本<b class='flag-5'>Go</b><b class='flag-5'>實(shí)現(xiàn)</b>的社區(qū)系統(tǒng)

    5G 網(wǎng)絡(luò)切片之OTN切片和FlexE切片區(qū)別

    5G 網(wǎng)絡(luò)切片本質(zhì)上是一個(gè) E2E 概念,將用戶(hù)設(shè)備連接到租戶(hù)特定的應(yīng)用程序。E2E 網(wǎng)絡(luò)切片由RAN 切片、核心切片和傳輸切片組成。每個(gè)網(wǎng)
    發(fā)表于 01-04 11:56 ?3307次閱讀

    如何實(shí)現(xiàn)端到端網(wǎng)絡(luò)切片

    3GPP將網(wǎng)絡(luò)切片定義為5G 網(wǎng)絡(luò)的主要功能之一,網(wǎng)絡(luò)切片可看作是動(dòng)態(tài)創(chuàng)建的邏輯端到端網(wǎng)絡(luò)。在深入研究網(wǎng)絡(luò)切片的概念之前,我們先簡(jiǎn)單回顧下 5G 的三大應(yīng)用場(chǎng)景。
    發(fā)表于 06-15 17:56 ?1474次閱讀
    如何<b class='flag-5'>實(shí)現(xiàn)</b>端到端網(wǎng)絡(luò)<b class='flag-5'>切片</b>?

    golang通過(guò)切片創(chuàng)建新的切片

    通過(guò)切片創(chuàng)建新的切片 切片之所以被稱(chēng)為切片,是因?yàn)閯?chuàng)建一個(gè)新的切片,也就是把底層數(shù)組切出一部分。通過(guò)切片
    的頭像 發(fā)表于 10-09 09:48 ?614次閱讀
    golang通過(guò)<b class='flag-5'>切片</b>創(chuàng)建新的<b class='flag-5'>切片</b>