一、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