数据类型底层实现(二)slice

数据结构

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

Pointer 是指向一个数组的指针,len 代表当前切片的长度,cap 是当前切片的容量。cap 总是大于等于 len 的。

扩容

当我们对slice进行append操作时,若len + 追加元素个数 <= cap时,不会发生内存扩张;否则,新的内存被申请,同时旧的数据被拷贝至新内存的前部;如果切片的容量小于 1024 个元素,于是扩容的时候就翻倍增加容量。上面那个例子也验证了这一情况,总容量从原来的4个翻倍到现在的8个。一旦元素个数超过 1024 个元素,那么增长因子就变成 1.25 ,即每次增加原来容量的四分之一。

nil切片和空切片

        var a []int //nil切片
    b:=make([]int,0) //空切片
        c := make([]int,0)//空切片
        d := []int{}//空切片

空切片的底层数组为空,但底层数组指针非空

range 切片

range循环遍历切片,拿到的 Value 其实是切片里面的值拷贝

        array := []int{10, 20, 30, 40}
    for key, item := range array {
        fmt.Println(&array[key])
        fmt.Println(&item)
    }

输出结果为:

0xc000014240
0xc0000180a0
0xc000014248
0xc0000180a0
0xc000014250
0xc0000180a0
0xc000014258
0xc0000180a0
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容