go array和slice的區別

2021-09-06 03:43:02 字數 1027 閱讀 3274

屬於集合類的型別,值都可以用來儲存某一種型別的值(或者說元素)

陣列的長度固定,陣列是值型別(值型別有基本資料型別,結構體型別),slice的值長度可變,屬於引用型別(引用型別:字典型別,通道型別,函式型別)切片是引用傳遞,所以它們不需要使用額外的記憶體並且比使用陣列更有效率。

如果傳遞的是引用型別,那麼就是「傳引用」,如果傳遞的是值型別,那麼就是「傳值」(會把以前的資料複製一遍)

陣列長度在宣告的時候就必須給定,並且之後不會再改變。

slice型別的字面量中只有元素型別,沒有長度。切片長度可以自動隨著元素數量的增長而增長,但不會隨著元素數量的減少而減少。

陣列的容量=長度,不可改變。

乙個slice由三個部分構成:指標、長度和容量。指標指向第乙個slice元素對應的底層陣列元素的位址。長度對應slice中元素的數目;長度不能超過容量,容量一般是從slice的開始位置到底層資料的結尾位置。通過len和cap函式分別返回slice的長度和容量。

一旦乙個slice無法容納更多的元素,go會擴容,但不會改變原來的切片,而是會生成乙個容量更大的slice,然後把原有的元素和新元素一起copy到新的slice中。一般情況下,可簡單認為新slice的容量是舊slice容量的2倍。

但是當原slice的長度》= 1024,go會以原容量的1.25倍作為新容量的基準,新容量基準會不斷與1.25相乘,直到結果不小於原長度與要追加的元素數量之和。最終,新容量要比新長度要大 一些。

如果一次追加的元素過多,以至於使新長度比原容量的2倍還要大,那麼新容量就會以新長度為基準。

乙個slice的底層陣列永遠不會倍替換,雖然在擴容的時候,go一定會生成新的底層陣列,但同時也生成了新的 slice。只是把新slice作為了新底層陣列的視窗,而沒有對原slice及其底層陣列做任何改動。

slice擴容策略

js中的語法 splice和slice的區別

splice index,count 是用來刪除 插入 替換用的 1 刪除的功能 引數 index 開始位置的索引 count 要刪除元素的個數 返回 返回的是包含被刪除元素的陣列物件 var arr a b c d var newarr arr.splice 0,4 console.log new...

slice和splice的區別

因為最近一段時間有些東西用的少了所以有點忘記了,今天就來說下我之前忘記的什麼是slice和splice slice 方法可從已有的陣列中返回選定的元素。必須寫,規定從何處開始尾部開始選取。如果是負數,那麼它規定從陣列尾部開始算起的位置。也就是說 1指最後乙個元素,2指倒數第二個元素,以此類推。可選,...

slice和splice的區別

一 slice slice是指在指定乙個陣列中的元素建立乙個新的陣列,即原陣列不會改變。slice引數 slice start,end slice方法,在string物件和array物件的用法很類似。對於陣列物件來說,slice 方法提取 從 start下標起 以end下標 為結尾的 一段元素 但不...