亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

golang中數(shù)組與切片的區(qū)別詳析

 更新時(shí)間:2022年11月30日 08:55:18   作者:周?-_-  
數(shù)組是固定長(zhǎng)度,常量,切片長(zhǎng)度是可以改變,所以是一個(gè)可變的數(shù)組,下面這篇文章主要給大家介紹了關(guān)于golang中數(shù)組與切片區(qū)別的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一. Go 切片和 Go 數(shù)組定義

Go 切片:又稱動(dòng)態(tài)數(shù)組,它實(shí)際是基于數(shù)組類型做的一層封裝。

Go 數(shù)組:數(shù)組是內(nèi)置(build-in)類型,是一組同類型數(shù)據(jù)的集合,它是值類型,通過(guò)從 0 開始的下標(biāo)索引訪問(wèn)元素值。在初始化后長(zhǎng)度是固定的,無(wú)法修改其長(zhǎng)度。當(dāng)作為方法的參數(shù)傳入時(shí)將復(fù)制一份數(shù)組而不是引用同一指針。數(shù)組的長(zhǎng)度也是其類型的一部分,通過(guò)內(nèi)置函數(shù) len(array)獲取其長(zhǎng)度。

二.切片與數(shù)組的區(qū)別

Go 數(shù)組與像 C/C++等語(yǔ)言中數(shù)組略有不同:

1. Go 中的數(shù)組是值類型,換句話說(shuō),如果你將一個(gè)數(shù)組賦值給另外一個(gè)數(shù)組,那么,實(shí)際上就是將整個(gè)數(shù)組拷貝一份。因此,在 Go 中如果將數(shù)組作為函數(shù)的參數(shù)傳遞的話,那效率就肯定沒有傳遞指針高了。

2. 數(shù)組的長(zhǎng)度也是類型的一部分,這就說(shuō)明[10]int和[20]int不是同一種數(shù)據(jù)類型。并且Go 語(yǔ)言中數(shù)組的長(zhǎng)度是固定的,且不同長(zhǎng)度的數(shù)組是不同類型,這樣的限制帶來(lái)不少局限性。

3. 而切片則不同,切片(slice)是一個(gè)擁有相同類型元素的可變長(zhǎng)序列,可以方便地進(jìn)行擴(kuò)容和傳遞,實(shí)際使用時(shí)比數(shù)組更加靈活,這也正是切片存在的意義。而且切片是引用類型,因此在當(dāng)傳遞切片時(shí)將引用同一指針,修改值將會(huì)影響其他的對(duì)象。

三. 切片使用

切片定義方式

  var a []int                    //nil切片,和nil相等,一般用來(lái)表示一個(gè)不存在的切片
   var b []int{}                //空切片,和nil不相等,一般用來(lái)表示一個(gè)空的集合
   var c []int{1, 2, 3}        //有3個(gè)元素的切片,len和cap都為3
   var d = c[:2]                //有2個(gè)元素的切片,len為2,cap為3
   var e = c[:2:cap(c)]        //有2個(gè)元素的切片,len為2,cap為3
   var f = c[:0]                //有0個(gè)元素的切片,len為0,cap為3
   var g = make([]int, 3)        //創(chuàng)建一個(gè)切片,len和cap均為3
   var h = make([]int, 3, 6)    //創(chuàng)建一個(gè)切片,len為3,cap為5
   var i = make([]int, 0, 3)    //創(chuàng)建一個(gè)切片,len為0,cap為3

從數(shù)組中切取切片

數(shù)組和切片是緊密相連的。切片可以用來(lái)訪問(wèn)數(shù)組的部分或全部元素,而這個(gè)數(shù)組稱為切片的底層數(shù)組。切片的指針指向數(shù)組第一個(gè)可以從切片中訪問(wèn)的元素,這個(gè)元素并不一定是數(shù)組的第一個(gè)元素。

一個(gè)底層數(shù)組可以對(duì)應(yīng)多個(gè)切片,這些切片可以引用數(shù)組的任何位置,彼此之前的元素可以重疊。

slice 操作符 s[i:j] 創(chuàng)建了一個(gè)新的 slice,這個(gè)新的 slice 引用了 s 中從 i 到 j-1 索引位置的所有元素。

如果表達(dá)式省略了 i,那么默認(rèn)是s[0:j];如果省略了 j,默認(rèn)是s[i:len(s)];

  //創(chuàng)建一個(gè)數(shù)組
  months := [...]string{1:"January", /*...*/, 12: "December"}
  Q2 := months[4:7]
  summer := months[6:9]
  fmt.Println(Q2)                //["April" "May" "June"]
  fmt.Println(summer)            //["June" "July" "August"]

月份名稱字符串?dāng)?shù)組與其對(duì)應(yīng)的兩個(gè)元素重疊的 slice 圖示

注意:切片與原數(shù)組或切片共享底層空間,修改切片會(huì)影響原數(shù)組或切片

迭代切片

切片可以用 range 迭代,但是要注意:如果只用一個(gè)值接收 range,則得到的只是切片的下標(biāo),用兩個(gè)值接收 range,則得到的才是下標(biāo)和對(duì)應(yīng)的值。

  //使用一個(gè)值接收range, 則得到的是切片的下標(biāo)
   for i := range months {
       fmt.Println(i)        //返回下標(biāo) 0 1 ... 12
   }
   //使用兩個(gè)值接收range,則得到的是下標(biāo)和對(duì)應(yīng)的值
   for i, v := range months {
       fmt.Println(i, v)     //返回下標(biāo)0 1 ... 12 和 值 "" "January" ... "December"
   }

切片拷貝

使用copy內(nèi)置函數(shù)拷貝兩個(gè)切片時(shí),會(huì)將源切片的數(shù)據(jù)逐個(gè)拷貝到目的切片指向的數(shù)組中,拷貝數(shù)量取兩個(gè)切片的最小值。

例如長(zhǎng)度為 10 的切片拷貝到長(zhǎng)度為 5 的切片時(shí),將拷貝 5 個(gè)元素。也就是說(shuō),拷貝過(guò)程中不會(huì)發(fā)生擴(kuò)容。

copy 函數(shù)有返回值,它返回實(shí)際上復(fù)制的元素個(gè)數(shù),這個(gè)值就是兩個(gè) slice 長(zhǎng)度的較小值。

切片擴(kuò)容-append 函數(shù)

//通過(guò)append()函數(shù)可以在切片的尾部追加 N 個(gè)元素
  var a []int
  a = append(a, 1)                    // 追加一個(gè)元素
  a = append(a, 1, 2, 3)                // 追加多個(gè)元素
  a = append(a, []int{1, 2, 3}...)    // 追加一個(gè)切片,注意追加切片時(shí)后面要加...
//使用 append()函數(shù)也可以在切片頭部添加元素
  a = append([]int{0}, a...)            // 在開頭添加一個(gè)元素
  a = append([]int{1, 2, 3}, a...)    // 在開頭添加一個(gè)切片

注:從頭部添加元素會(huì)引起內(nèi)存的重分配,導(dǎo)致已有元素全部復(fù)制一次。因此從頭部添加元素的開銷要比從尾部添加元素大很多

//通過(guò) append()函數(shù)鏈?zhǔn)讲僮鲝闹虚g插入元素
  a = append(a[:i], append([]int{x}, a[i:]...)...)        //在第i個(gè)位置上插入x
  a = append(a[:i], append([]int{1, 2, 3}, a[i:]...)...)    //在第i個(gè)位置上插入切片

使用鏈?zhǔn)讲僮髟诓迦朐?,在?nèi)層 append 函數(shù)中會(huì)創(chuàng)建一個(gè)臨式切片,然后將a[i:]內(nèi)容復(fù)制到新創(chuàng)建的臨式切片中,再將臨式切片追加至a[:i]中。

通過(guò) append()和 copy()函數(shù)組合從中間插入元素

使用這種方式可以避免創(chuàng)建過(guò)程中間的臨式切片,也可以做到從中間插入元素

  //中間插入一個(gè)元素
  a = append(a, 0)            //切片擴(kuò)展一個(gè)空間
  copy(a[i+1:], a[i:])        //a[i:]向后移動(dòng)一個(gè)位置
  a[i] = x                    //設(shè)置新添加的元素
  //中間插入多個(gè)元素
  a = append(a, x...)            //為x切片擴(kuò)展足夠的空間
  copy(a[i+len(x):], a[i:])    //a[i:]向后移動(dòng)len(x)個(gè)位置
  copy(a[i:], x)                //復(fù)制新添加的切片

使用此方式雖然稍顯復(fù)雜,但是可以減少創(chuàng)建中間臨時(shí)切片的開銷。

刪除元素

很遺憾,Go 語(yǔ)言中并沒有提供直接刪除指定位置元素的方式。不過(guò)根據(jù)切片的性質(zhì),我們可以通過(guò)巧妙的拼接切片來(lái)達(dá)到刪除指定數(shù)據(jù)的目的。

a = []int{1, 2, 3}
//刪除尾部元素
a = a[:len(a) - 1]                //刪除尾部一個(gè)元素
a = a[:len(a) - N]                //刪除尾部N個(gè)元素
//刪除頭部元素
a = [1:]                        //刪除開頭1個(gè)元素
a = [N:]                        //刪除開頭N個(gè)元素
//刪除中間元素
a = append(a[:i], a[i+1:]...)    //刪除中間一個(gè)元素
a = append(a[:i], a[i+N:]...)    //刪除中間N個(gè)元素

總結(jié)

到此這篇關(guān)于golang中數(shù)組與切片區(qū)別的文章就介紹到這了,更多相關(guān)go數(shù)組與切片區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一起聊聊Go語(yǔ)言中的語(yǔ)法糖的使用

    一起聊聊Go語(yǔ)言中的語(yǔ)法糖的使用

    語(yǔ)法糖通常是用來(lái)簡(jiǎn)化代碼編寫的,特性就是使用語(yǔ)法糖前后編譯的結(jié)果是相同的。這篇文章主要就來(lái)和大家一起聊聊Go語(yǔ)言中的語(yǔ)法糖的實(shí)現(xiàn)
    2022-07-07
  • Go語(yǔ)言基礎(chǔ)學(xué)習(xí)之?dāng)?shù)組的使用詳解

    Go語(yǔ)言基礎(chǔ)學(xué)習(xí)之?dāng)?shù)組的使用詳解

    數(shù)組相必大家都很熟悉,各大語(yǔ)言也都有數(shù)組的身影。Go 語(yǔ)言也提供了數(shù)組類型的數(shù)據(jù)結(jié)構(gòu)。本文就來(lái)通過(guò)一些簡(jiǎn)單的示例帶大家了解一下Go語(yǔ)言中數(shù)組的使用,希望對(duì)大家有所幫助
    2022-12-12
  • 7分鐘讀懂Go的臨時(shí)對(duì)象池pool以及其應(yīng)用場(chǎng)景

    7分鐘讀懂Go的臨時(shí)對(duì)象池pool以及其應(yīng)用場(chǎng)景

    這篇文章主要給大家介紹了關(guān)于如何通過(guò)7分鐘讀懂Go的臨時(shí)對(duì)象池pool以及其應(yīng)用場(chǎng)景的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用Go具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧
    2018-11-11
  • 對(duì)Go語(yǔ)言中的context包源碼分析

    對(duì)Go語(yǔ)言中的context包源碼分析

    這篇文章主要對(duì)Go語(yǔ)言中的context包源碼進(jìn)行分析,context包析是1.15,context包定義了一個(gè)Context類型過(guò)這個(gè)Context接口類型,?就可以跨api邊界/跨進(jìn)程傳遞一些值,下面我們就來(lái)對(duì)context包源碼進(jìn)行分析,需要的小伙伴可以參考一下
    2022-02-02
  • CSP communicating sequential processes并發(fā)模型

    CSP communicating sequential processes并發(fā)模型

    這篇文章主要為大家介紹了CSP communicating sequential processes并發(fā)模型,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Go語(yǔ)言多值替換的HTML模板實(shí)例分析

    Go語(yǔ)言多值替換的HTML模板實(shí)例分析

    這篇文章主要介紹了Go語(yǔ)言多值替換的HTML模板,實(shí)例分析了Go語(yǔ)言多值替換與數(shù)組迭代的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go語(yǔ)言并發(fā)技術(shù)詳解

    Go語(yǔ)言并發(fā)技術(shù)詳解

    這篇文章主要介紹了Go語(yǔ)言并發(fā)技術(shù)詳解,本文講解了goroutine、channels、Buffered Channels、Range和Close等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • Go語(yǔ)言中一些不常見的命令參數(shù)詳解

    Go語(yǔ)言中一些不常見的命令參數(shù)詳解

    這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中一些不常見的命令參數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • 基于Golang實(shí)現(xiàn)Redis分布式鎖解決秒殺問(wèn)題

    基于Golang實(shí)現(xiàn)Redis分布式鎖解決秒殺問(wèn)題

    這篇文章主要給大家介紹了使用Golang實(shí)現(xiàn)Redis分布式鎖解決秒殺問(wèn)題,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-08-08
  • 詳解如何在golang鏡像中設(shè)置指定時(shí)區(qū)

    詳解如何在golang鏡像中設(shè)置指定時(shí)區(qū)

    這篇文章主要為大家詳細(xì)介紹了如何在golang鏡像中設(shè)置指定時(shí)區(qū),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下
    2023-04-04

最新評(píng)論