【Go Slice詳解】讀者紛紛表示終于理解了Cap
定義
打印結(jié)果:
解析: 說(shuō)明我們已經(jīng)聲明成功了,但是并沒(méi)有開(kāi)辟內(nèi)存空間,因?yàn)閟1、s2的值為nil
聲明并初始化
我們可以在聲明的同時(shí)初始化
打印結(jié)果:
解析:初始化成功,s1 s2的值都不等于nil
長(zhǎng)度和容量
分別使用len()、cap()獲得切片的長(zhǎng)度和容量
打印結(jié)果:
解析:和我們預(yù)期的一致,長(zhǎng)度和容量都為3
由數(shù)組得到切片
開(kāi)篇我已經(jīng)提到數(shù)組和切片的關(guān)系,這里再進(jìn)一步講一下:
- 切片的本質(zhì)是操作數(shù)組,只是數(shù)組是固定長(zhǎng)度的,而切片的長(zhǎng)度可變的
- 切片是引用類(lèi)型,可以理解為引用數(shù)組的一個(gè)片段;而數(shù)組是值類(lèi)型,把數(shù)組A賦值給數(shù)組B,會(huì)為數(shù)組B開(kāi)辟新的內(nèi)存空間,修改數(shù)組B的值并不會(huì)影響數(shù)組A。
- 而切片作為引用類(lèi)型,指向同一個(gè)內(nèi)存地址,是會(huì)互相影響的。
打印結(jié)果:
注意:a1[0:4] 基于一個(gè)數(shù)組切割 [0:4]左包含 右不包含 即為[1,2,3,4]
更多切割方式舉例
打印結(jié)果:
解析:都符合上面提到的??左包含,右不包含?
?原則 s4從下標(biāo)2開(kāi)始截取,截取到下標(biāo)4 s5省略了第一個(gè)參數(shù),表示從下標(biāo)0開(kāi)始截取 s6省略了第二個(gè)參數(shù),表示截取到最后一個(gè)元素 s7省略了兩個(gè)參數(shù),只填寫(xiě)了中間的冒號(hào):,表示取全部元素
切片的長(zhǎng)度和容量
切片的長(zhǎng)度很好理解,就是元素的個(gè)數(shù)。
切片的容量我們重點(diǎn)理解一下:在切片引用的底層數(shù)組中從切片的第一個(gè)元素到數(shù)組最后一個(gè)元素的長(zhǎng)度就是切片的容量
我來(lái)畫(huà)個(gè)圖:
再舉個(gè)栗子
我們看下面這個(gè)栗子就很好理解啦:
打印結(jié)果:
解析:a1是數(shù)組長(zhǎng)度為9,容量也為9,值是從1~9
s5/s6/s7都是切割數(shù)組a1得到的切片。
s5的長(zhǎng)度為4,因?yàn)橹挥? 2 3 4這4個(gè)元素,容量為9,因?yàn)閟5切片是從數(shù)組起始位置開(kāi)始切割的:第一個(gè)元素是1,而s5底層數(shù)組a1最后一個(gè)元素是9,1~9共9個(gè)元素,所以s5的容量為9。
s6的長(zhǎng)度為7,因?yàn)閟6的元素是3-9這7個(gè)元素;容量也為7,因?yàn)閟5的底層數(shù)組最后一個(gè)元素是9,3-9共7個(gè)元素,所以s6的容量為7。
S7更好理解了,長(zhǎng)度和容量都是9,小伙伴們自己理解一下。
切片再切片
我們可以對(duì)切片進(jìn)行再切片操作
比如,我們針對(duì)上面的數(shù)據(jù)再次切片進(jìn)行測(cè)試
打印結(jié)果:
解析:我們知道可以對(duì)切片進(jìn)行再次切片就可以,至于長(zhǎng)度和容器大家搞明白上面的栗子,這個(gè)輸出結(jié)果就是意料之中的了。
slice是引用類(lèi)型
我們舉個(gè)栗子來(lái)證明切片是引用類(lèi)型
打印結(jié)果:
解析:由此我們可以明確的知道切片是引用類(lèi)型,當(dāng)?shù)讓訑?shù)組改變時(shí),不管是切片,還是切片再切片,值都會(huì)改變。因?yàn)樗麄兪褂玫氖且粋€(gè)內(nèi)存塊,引用的一個(gè)內(nèi)存地址。
總結(jié)
這篇文章介紹了切片的特點(diǎn),如何定義切片,如果由數(shù)組切割切片,切片的引用類(lèi)型特征。
本文轉(zhuǎn)載自微信公眾號(hào)「 程序員升級(jí)打怪之旅」,作者「王中陽(yáng)Go」,可以通過(guò)以下二維碼關(guān)注。
轉(zhuǎn)載本文請(qǐng)聯(lián)系「 程序員升級(jí)打怪之旅」公眾號(hào)。