slice介紹
數(shù)組的長(zhǎng)度在定義之后無法再次修改;數(shù)組是值類型,每次傳遞都將產(chǎn)生一份副本。顯然這種數(shù)據(jù)結(jié)構(gòu)無法完全滿足開發(fā)者的真實(shí)需求。在初始定義數(shù)組時(shí),我們并不知道需要多大的數(shù)組,因此我們就需要“動(dòng)態(tài)數(shù)組”。在Go里面這種數(shù)據(jù)結(jié)構(gòu)叫slice,slice并不是真正意義上的動(dòng)態(tài)數(shù)組,而是一個(gè)引用類型。slice總是指向一個(gè)底層array,slice的聲明也可以像array一樣,只是不需要長(zhǎng)度,它是可變長(zhǎng)的,可以隨時(shí)往slice里面加數(shù)據(jù)。
初看起來,數(shù)組切片就像一個(gè)指向數(shù)組的指針,實(shí)際上它擁有自己的數(shù)據(jù)結(jié)構(gòu),而不僅僅是個(gè)指針。數(shù)組切片的數(shù)據(jù)結(jié)構(gòu)可以抽象為以下3個(gè)變量:
1.一個(gè)指向原生數(shù)組的指針(point):指向數(shù)組中slice指定的開始位置;
2.?dāng)?shù)組切片中的元素個(gè)數(shù)(len):即slice的長(zhǎng)度;
3.?dāng)?shù)組切片已分配的存儲(chǔ)空間(cap):也就是slice開始位置到數(shù)組的最后位置的長(zhǎng)度。
從底層實(shí)現(xiàn)的角度來看,數(shù)組切片實(shí)際上仍然使用數(shù)組來管理元素,基于數(shù)組,數(shù)組切片添加了一系列管理功能,可以隨時(shí)動(dòng)態(tài)擴(kuò)充存放空間,并且可以被隨意傳遞而不會(huì)導(dǎo)致所管理的元素被重復(fù)復(fù)制。
slice聲明
聲明slice時(shí)方括號(hào)[]內(nèi)沒有任何數(shù)據(jù)
聲明一個(gè)元素類型為int的slice
var mySlice []int 聲明兩個(gè)元素類型為byte的slice
golang 中的 slice 非常強(qiáng)大,讓數(shù)組操作非常方便高效。在開發(fā)中不定長(zhǎng)度表示的數(shù)組全部都是 slice 。但是很多同學(xué)對(duì) slice 的模糊認(rèn)識(shí),造成認(rèn)為golang中的數(shù)組是引用類型,結(jié)果就是在實(shí)際開發(fā)中碰到很多坑,以至于出現(xiàn)一些莫名奇妙的問題,數(shù)組中的數(shù)據(jù)丟失了。
下面我們就開始詳細(xì)理解下 slice ,理解后會(huì)對(duì)開發(fā)出高效的程序非常有幫助。
這個(gè)是 slice 的數(shù)據(jù)結(jié)構(gòu),它很簡(jiǎn)單,一個(gè)指向真實(shí) array 地址的指針 ptr ,slice 的長(zhǎng)度 len 和容量 cap 。
其中 len 和 cap 就是我們?cè)谡{(diào)用 len(slice) 和 cap(slice) 返回的值。
我們來按照 slice 的數(shù)據(jù)結(jié)構(gòu)定義來解析出 ptr, len, cap
// 按照上圖定義的數(shù)據(jù)結(jié)構(gòu) type Slice struct { ptr unsafe.Pointer // Array pointer len int // slice length cap int // slice capacity }
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。