Slice原始碼分析

2021-10-04 05:23:06 字數 3086 閱讀 1247

package runtime

import

("runtime/internal/math"

"runtime/internal/sys"

"unsafe"

)//slice 包括array,這是乙個指標,指向實際資料儲存的位置,len是當前的切片資料長度,cap是容量。

type slice struct

//此處涉及到底層的記憶體管理。

type notinheapslice struct

//定義了兩個panic錯誤,len panic 與 cap panic。

func

panicmakeslicelen()

func

panicmakeslicecap()

// makeslice 的作用就是建立切片 ,在使用make建立切片時,會自動的替換為makeslice函式。

//et就是傳入的資料型別,len是make要求的切片長度,cap是容量。

//makeslice 做哪幾件事情?

// 1. 判斷越不越界

// 2. 分配記憶體空間。

func

makeslice

(et *_type,

len,

capint

) unsafe.pointer

panicmakeslicecap()

}//為要求的資料結構分配記憶體並啟動gc ,並返回相應指標

return

mallocgc

(mem, et,

true)}

//驗證 len 與 cap然後建立切片

func

makeslice64

(et *_type, len64, cap64 int64

) unsafe.pointer

cap:=

int(cap64)

ifint64

(cap

)!= cap64

return

makeslice

(et,

len,

cap)

}//實現切片的自動擴容

func

growslice

(et *_type, old slice,

capint

) slice

if msanenabled

ifcap

< old.

capif et.size ==0}

newcap := old.

cap doublecap := newcap + newcap

ifcap

> doublecap

else

else

if newcap <=0}

}var overflow bool

var lenmem, newlenmem, capmem uintptr

switch

else

lenmem =

uintptr

(old.

len)

<< shift

newlenmem =

uintptr

(cap

)<< shift

capmem =

roundupsize

(uintptr

(newcap)

<< shift)

overflow =

uintptr

(newcap)

>

(maxalloc >> shift)

newcap =

int(capmem >> shift)

default

: 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)

}if overflow || capmem > maxalloc

var p unsafe.pointer

if et.ptrdata ==

0else

}memmove

(p, old.array, lenmem)

return slice

}func

ispoweroftwo

(x uintptr

)bool

func

slicecopy

(to, fm slice, width uintptr

)int

n := fm.

lenif to.

len< n

if width ==

0if raceenabled

if msanenabled

size :=

uintptr

(n)* width

if size ==

1else

return n

}func

slicestringcopy

(to [

]byte

, fm string

)int

n :=

len(fm)

iflen

(to)

< n

if raceenabled

if msanenabled

memmove

(unsafe.

pointer

(&to[0]

),stringstructof

(&fm)

.str,

uintptr

(n))

return n

}

Lodash原始碼講解 slice函式

我們首先來看一下這個函式的原始碼,原始碼如下所示 creates a slice of array from start up to,but not including,end note this method is used instead of array slice to ensure den...

golang之slice切片原始碼解析

切片作為常用的資料結構體之一,切片實際上是陣列的抽象,也稱動態陣列,顧名思義,它自帶擴容的機制,因為其靈活性,相對陣列來說被運用的更加廣泛。golang的切片實現是在包runtime slice.go,切片結構體包含array指向陣列的指標,是一塊連續的記憶體空間,len代表切片的長度,cap代表切...

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...