数组就是底层数组的地址
<李>len切片的长度
<李>帽切片的容量
创建切片
src/运行/片。去# L83
func makeslice (len, et * _type, cap int), unsafe.Pointer { ,,,,overflow mem:=, math.MulUintptr (et.size, uintptr (cap)) ,,,.... ,,,return mallocgc (mem,,等,,真的)}基本逻辑就是根据容量申请一块内存。
切片扩容
扩容是当切片的长度大于容量的时候,底层数组已经装不下时
func growslice (et * _type, old 片,,cap int), slice { ,,,… ,,,//,如果新要扩容的容量比原来的容量还要小,直接报恐慌 ,,,if cap & lt;, old.cap { ,,,,,,,恐慌(errorString (“growslice: cap out of range")) ,,,} ,,,//,如果当前切片的大小为0,还调用了扩容方法,那么就新生成一个新的容量的切片返回 ,,,//,[]结构{} ,,,if et.size ==, 0, { ,,,,,,,return 片{unsafe.Pointer(及zerobase), old.len,,帽} ,,,} ,,,newcap :=old.cap ,,,doublecap :=, newcap +, newcap ,,,//要扩容的容量大于2,* oldcap 新切片容量,=,该容量 ,,,if cap 祝辞,doublecap { ,,,,,,,newcap =,帽子 ,,,},{else ,,,//,旧容量,小于1024年新容量=,旧容量,*,2,也就是扩容1倍 ,,,,,,,if old.cap & lt;, 1024, { ,,,,,,,,,,,newcap =, doublecap ,,,,,,,}, {else ,,,,,,,,,,,//,扩容容量,=,旧容量,+旧容量* 1/4 ,,,,,,,,,,,for 0, & lt;, newcap ,,, newcap & lt;, cap { ,,,,,,,,,,,,,,,newcap +=, newcap /4 ,,,,,,,,,,,} ,,,,,,,,,,,//溢出之后,新容量=要扩容的容量 ,,,,,,,,,,,if newcap & lt;=, 0, { ,,,,,,,,,,,,,,,newcap =,帽子 ,,,,,,,,,,,} ,,,,,,,} ,,,} ,,,var overflow 保龄球 ,,,//,计算新的切片的容量,长度。 ,,,var lenmem,, newlenmem, capmem uintptr ,,,.... ,,,var p unsafe.Pointer ,,, if et.ptrdata ==, 0, { ,,,,,,,p =, mallocgc (capmem, nil,,假) ,,,,,,,memclrNoHeapPointers(增加(p, newlenmem),, capmem-newlenmem) ,,,},{else ,,,,,,,p =, mallocgc (capmem,,等,,真的) ,,,,,,,if lenmem 祝辞,0,,,,writeBarrier.enabled { ,,,,,,,,,,,bulkBarrierPreWriteSrcOnly (uintptr (p), uintptr (old.array), lenmem-et.size + et.ptrdata) ,,,,,,,} ,,,} ,,,//移动到p null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null