Golang之slice底层机制

一、Slice介绍

1、在Go语言中,Slice切片的底层便是数组,所以数组有的特点,Slice都有。
2、Slice可以通过append向slice中追加元素,在容量不够时进行动态扩容。

在这里插入图片描述
上图为slice的底层结构图解,通过图解,我们可以简单了解slice切片由三部分组成:容量(Capacity)、长度(Length)和指向底层数组某元素的指针。

二、Slice扩容机制

Slice扩容机制有以下几个步骤:

1、预估扩容后容量newCap

ints := []int{1,2} //扩容前容量为oldcap为2
ints = append(ints,3,4,5)//按照预估,扩容后容量至少 newcap为5
在这里插入图片描述

2、newCap个元素需要多大的内存:预估容量 * 元素类型大小

newCap个元素需要的内存大小计算:预估容量 x 元素类型大小对应题目中,预估容量 = 5;同时因为在64位计算机中int型元素的大小为8字节;所以所需内存大小为 5 * 8 = 40

3、匹配合适的内存规格,并计算得出真的newCap
在这里插入图片描述从上一个步骤中,我们知道所需内存为40个字节,对应Go的内存规格,我们通过向上取整,取到48字节的内存规格

因此,最后的newCap = 48 / 8 = 6!

案例:

package main

import "fmt"

func main() {
	ints := []int{1,2}  //扩容前容量
	fmt.Printf("ints:%v,oldlen:%v,oldcap:%v\n",ints,len(ints),cap(ints))

	ints = append(ints,3,4,5)
	fmt.Printf("ints:%v,newlen:%v,newcap:%v\n",ints,len(ints),cap(ints))
}

结果:

ints:[1 2],oldlen:2,oldcap:2
ints:[1 2 3 4 5],newlen:5,newcap:6
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值