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...