Slice 数据结构
首先来看看slice的数据结构
type slice struct{
array unsafe.Pointer //指针指向底层数组 8B
len int // 8B
cap int // 8B
}
底层数据结构大致如下: slice数据指针指向array地址,拿Slice{ptr *[]int8}数组为例:伪代码~
//上图中函数为伪代码,表示[0:3]指针的值,实际上指针不能被索引
(*[]int8)(unsafe.pointer(ptr)[1]) //3
*(*[]int8)(unsafe.pointer(ptr)) //[1 3 2 5]
(*[]int8)(unsafe.pointer(ptr))[1:4] // index越界 会在[3]的后面取一个字节长度并读取值
切片内存分配和创建
两个数组的slice内存分布如下图.
//make([]interface,len,cap)-> unsafe.Pointer
func makeslice(et *_type, len, cap int) unsafe.Pointer {
// 越界检测 cap len
mem, overflow := math.MulUintptr(et.size, uintptr(cap))
if overflow || mem > maxAlloc || len <