Go 語言切片是對數(shù)組的抽象另凌。
Go 數(shù)組的長度不可改變糕档,在特定場景中這樣的集合就不太適用境析,Go中提供了一種靈活义矛,功能強悍的內(nèi)置類型切片("動態(tài)數(shù)組"),與數(shù)組相比切片的長度是不固定的妨托,可以追加元素缸榛,在追加時可能使切片的容量增大。
切片本身并不是動態(tài)數(shù)組或者數(shù)組指針兰伤。它內(nèi)部實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)通過指針引用底層數(shù)組内颗,設(shè)定相關(guān)屬性將數(shù)據(jù)讀寫操作限定在指定的區(qū)域內(nèi)。切片本身是一個只讀對象敦腔,其工作機制類似數(shù)組指針的一種封裝均澳。
切片(slice)是對數(shù)組一個連續(xù)片段的引用,所以切片是一個引用類型(因此更類似于 C/C++ 中的數(shù)組類型符衔,或者 Python 中的 list 類型)找前。這個片段可以是整個數(shù)組,或者是由起始和終止索引標(biāo)識的一些項的子集判族。需要注意的是躺盛,終止索引標(biāo)識的項不包括在切片內(nèi)。切片提供了一個與指向數(shù)組的動態(tài)窗口形帮。
給定項的切片索引可能比相關(guān)數(shù)組的相同元素的索引小槽惫。和數(shù)組不同的是,切片的長度可以在運行時修改辩撑,最小為 0 最大為相關(guān)數(shù)組的長度:切片是一個長度可變的數(shù)組界斜。
切片的結(jié)構(gòu)體由3部分構(gòu)成,Pointer 是指向一個數(shù)組的指針合冀,len 代表當(dāng)前切片的長度各薇,cap 是當(dāng)前切片的容量。cap 總是大于等于 len 的君躺。
如果想從 slice 中得到一塊內(nèi)存地址峭判,可以這樣做:
????s:=make([]byte,200)
????ptr:=unsafe.Pointer(&s[0])
如果反過來呢?從 Go 的內(nèi)存地址中構(gòu)造一個 slice晰洒。
????varptr unsafe.Pointer
????vars1=struct{
????????addr uintptr
????????len int
????????cap int
????}{ptr,length,length}
????s := *(*[]byte)(unsafe.Pointer(&s1))
構(gòu)造一個虛擬的結(jié)構(gòu)體朝抖,把 slice 的數(shù)據(jù)結(jié)構(gòu)拼出來啥箭。
當(dāng)然還有更加直接的方法谍珊,在 Go 的反射中就存在一個與之對應(yīng)的數(shù)據(jù)結(jié)構(gòu) SliceHeader,我們可以用它來構(gòu)造一個 slice
? ??var o []byte
? ??sliceHeader := (*reflect.SliceHeader)((unsafe.Pointer(&o)))
? ??sliceHeader.Cap=length
? ??sliceHeader.Len=length
? ??sliceHeader.Data=uintptr(ptr)
1、定義切片
(1)聲明一個未指定大小的數(shù)組來定義切片:var identifier []type ?(需要注意的是 [ ] 里面不要寫數(shù)組的容量砌滞,因為如果寫了個數(shù)以后就是數(shù)組了侮邀,而不是切片了)
(2)使用make()函數(shù)來創(chuàng)建切片:var slice1 []type = make([]type, len)
????????????????????????????????????????????????????????slice1 := make([]type, len)
? ??????????????????????????????????????????????????????make([]T, length, capacity)
2、切片的初始化
s :=[] int {1,2,3 } ?直接初始化切片贝润,[]表示是切片類型绊茧,{1,2,3}初始化值依次是1,2,3.其cap=len=3
s := arr[:] ????初始化切片s,是數(shù)組arr的引用
s := arr[startIndex:endIndex] ????將arr中從下標(biāo)startIndex到endIndex-1 下的元素創(chuàng)建為一個新的切片
s := arr[startIndex:]?? ??缺省endIndex時將表示一直到arr的最后一個元素
s := arr[:endIndex]?? ??缺省startIndex時將表示從arr的第一個元素開始
s1 := s[startIndex:endIndex]?? ??通過切片s初始化切片s1
s :=make([]int,len,cap)?? ??通過內(nèi)置函數(shù)make()初始化切片s,[]int 標(biāo)識為其元素類型為int的切片
3、內(nèi)置函數(shù)
len() 函數(shù):切片是可索引的打掘,并且可以由 len() 方法獲取長度华畏。
cap() 函數(shù):切片提供了計算容量的方法 cap() 可以測量切片最長可以達到多少。
append()函數(shù):如果想增加切片的容量尊蚁,我們必須創(chuàng)建一個新的更大的切片并把原分片的內(nèi)容都拷貝過來亡笑。
copy() 函數(shù):值拷貝。
4横朋、底層實現(xiàn)
https://blog.csdn.net/m0_37579159/article/details/79344056(感覺這篇作者寫得很好)