Golang:切片的底層詳解和初步使用

什么是切片

切片是 Golang 中比較特殊的數(shù)據(jù)結(jié)構(gòu)侄榴,這種數(shù)據(jù)結(jié)構(gòu)更便于使用和管理數(shù)據(jù)集合椭微。簡單的說,切片就是一種簡化版的動(dòng)態(tài)數(shù)組缠局。因?yàn)閯?dòng)態(tài)數(shù)組的長度不固定,所以切片的長度自然也就不能是類型的組成部分了考润。切片是圍繞動(dòng)態(tài)數(shù)組的概念構(gòu)建的狭园,是對(duì)數(shù)組的抽象。數(shù)組雖然有適用的地方糊治,但是數(shù)組的類型和操作都不夠靈活妙啃,因此在 Go 代碼中數(shù)組使用的并不是很多,而切片則使用的相當(dāng)廣泛,理解切片的原理和用法相當(dāng)重要揖赴。

切片的內(nèi)部結(jié)構(gòu)

我們先來看看切片的結(jié)構(gòu)定義馆匿,即 reflect.SliceHeader:

type SliceHeader struct {
    Data uintptr
    Len int
    Cap int
}

由切片的結(jié)構(gòu)定義可知,切片的結(jié)構(gòu)由三個(gè)信息組成:

  1. 指針燥滑,指向底層數(shù)組中切片指定的開始位置

  2. 長度渐北,即切片的長度

  3. 最大長度,也就是切片開始位置到數(shù)組的最后位置的長度

下圖給出了切片 x := [2, 3, 5, 7, 9, 11, 13, 15] 和 y := [1:3] 兩個(gè)切片對(duì)應(yīng)的內(nèi)存結(jié)構(gòu)铭拧。

切片底層結(jié)構(gòu)圖.png

切片的創(chuàng)建和初始化

讓我們看看切片有哪些創(chuàng)建和初始化的方式:

var(
  a []int // nil 切片赃蛛,和 nil 相等,一般用來表示一個(gè)不存在的切片
  b = []int{} // 空切片搀菩,和 nil 不相等呕臂,一般用來表示一個(gè)空的集合  
  c = []int{1, 2, 3, 4} // 有 4 個(gè)元素的切片,len 和 cap 都為 4
  d = c[:2] // 有 2 個(gè)元素的切片肪跋,len 為 2歧蒋,cap 為 4
  e = c[0:2:cap(c)] // 有 2 個(gè)元素的切片,len 為 2州既,cap 為 4
  f = c[:0] // 有 0 個(gè)元素的切片谜洽,len 為 0,cap 為 4
  g = make([]int, 3) // 有 3 個(gè)元素的切片吴叶,len 和 cap 都為 3
  h = make([]int, 3, 5) // 有 3 個(gè)元素的切片阐虚,len 為 3,cap 為 5
  i = make([]int, 0, 5) // 有 0 個(gè)元素的切片蚌卤,len 為 0实束,cap 為 5
)

使用 Golang 內(nèi)置的函數(shù) len() 可以查看切片中有效元素的長度,內(nèi)置的函數(shù) cap() 可以查看切片容量大小逊彭。

切片 len() 和 cap().png

修改切片

切片沒有自己的任何數(shù)據(jù)咸灿,它只是底層數(shù)組的一個(gè)表示。對(duì)切片所做的任何修改都將反映在底層數(shù)組中诫龙。

示例代碼:

package main

import (  
    "fmt"
)

func main() {  
    darr := [...]int{57, 89, 90, 82, 100, 78, 67, 69, 59}
    dslice := darr[2:5]
    fmt.Println("array before",darr)
    for i := range dslice {
        dslice[i]++
    }
    fmt.Println("array after",darr) 
}

運(yùn)行結(jié)果:

array before [57 89 90 82 100 78 67 69 59]  
array after [57 89 91 83 101 78 67 69 59] 

當(dāng)多個(gè)片共享相同的底層數(shù)組時(shí),每個(gè)元素所做的更改將在數(shù)組中反映出來鲫咽。

示例代碼:

package main

import (  
    "fmt"
)

func main() {  
    numa := [3]int{78, 79 ,80}
    nums1 := numa[:] //creates a slice which contains all elements of the array
    nums2 := numa[:]
    fmt.Println("array before change 1",numa)
    nums1[0] = 100
    fmt.Println("array after modification to slice nums1", numa)
    nums2[1] = 101
    fmt.Println("array after modification to slice nums2", numa)
}

運(yùn)行結(jié)果:

array before change 1 [78 79 80]  
array after modification to slice nums1 [100 79 80]  
array after modification to slice nums2 [100 101 80]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末签赃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子分尸,更是在濱河造成了極大的恐慌锦聊,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箩绍,死亡現(xiàn)場離奇詭異孔庭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門圆到,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怎抛,“玉大人,你說我怎么就攤上這事芽淡÷砭” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵挣菲,是天一觀的道長富稻。 經(jīng)常有香客問我,道長白胀,這世上最難降的妖魔是什么椭赋? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮或杠,結(jié)果婚禮上哪怔,老公的妹妹穿的比我還像新娘。我一直安慰自己廷痘,他們只是感情好蔓涧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笋额,像睡著了一般元暴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兄猩,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天茉盏,我揣著相機(jī)與錄音,去河邊找鬼枢冤。 笑死鸠姨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淹真。 我是一名探鬼主播讶迁,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼核蘸!你這毒婦竟也來了巍糯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤客扎,失蹤者是張志新(化名)和其女友劉穎祟峦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徙鱼,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宅楞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年针姿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厌衙。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡距淫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迅箩,到底是詐尸還是另有隱情溉愁,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布饲趋,位于F島的核電站拐揭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奕塑。R本人自食惡果不足惜堂污,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望龄砰。 院中可真熱鬧盟猖,春花似錦、人聲如沸换棚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽固蚤。三九已至娘汞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夕玩,已是汗流浹背你弦。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留燎孟,地道東北人禽作。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像揩页,于是被迫代替她去往敵國和親旷偿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344