go語言中slice的實現

2022-06-18 16:24:15 字數 930 閱讀 2091

slice是我們使用go語言時最經常使用的資料結構,所以我們還是有必要研究一下它的實現的,尤其是slice的擴容,具體實現參考src/runtime/slice.go

slice定義

type slice struct
根據growslice函式的名稱,可以很容易的猜到這就是slice擴容的實現。

if et.size == 0  // 未建立的slice在這裡建立

}

newcap := old.cap

doublecap := newcap + newcap // 新的容量是舊的容量的兩倍

if cap > doublecap else else

// set newcap to the requested cap when

// the newcap calculation overflowed.

if newcap <= 0

} }

lenmem = uintptr(old.len) * et.size

newlenmem = uintptr(cap) * et.size

capmem, overflow = math.muluintptr(et.size, uintptr(newcap)) // 計算記憶體空間

capmem = roundupsize(capmem) // 向上調整

newcap = int(capmem / et.size)

var p unsafe.pointer

if et.ptrdata == 0 else

} memmove(p, old.array, lenmem) // 拷貝舊的array

Go語言中Slice(切片)初探

最近上課學習go語言,看go語言指南,裡面說 乙個 slice 會指向乙個序列的值,並且包含了長度資訊,為了指定容量,可傳遞第三個引數到 make。感覺有些懵比,指向乙個序列的值?指定容量?我就在go指南上互動的地方做了點嘗試。本人蒟蒻,如有錯誤,希望大佬指出的時候不要激動。乙個slice 切片 是...

Go語言中陣列和slice的區別

go語言中陣列是具有固定長度而且擁有零個或者多個相同或相同資料型別元素的序列。由於陣列長度固定,所以在go語言比較少直接使用。而slice長度可增可減,使用場合比較多。更深入的區別在於 陣列在使用的過程中都是值傳遞,將乙個陣列賦值給乙個新變數或作為方法引數傳遞時,是將源陣列在記憶體中完全複製了乙份,...

Go語言中slice的用法例項分析

slice 指向陣列的值,並且同時包含了長度資訊。t 是乙個元素型別為 t 的 slice。複製 如下 package main import fmt func main fmt.println p p for i 0 i len p i slice 可以重新切片,建立乙個新的 slice 值指向相...