基础知识一:string与slice

[toc]

1. string的底层结构

图最清楚了,对于一个string类型的变量,在64位系统中,占用内存大小为16个字节,分别是内存起始地址8个字节,长度8个字节


image.png

2. slice的底层结构

一个slice的变量,在64位系统中,占用内存大小为24个字节(实际占用为32个字节,这是因为go内存管理单元没有24字节,最接近的为32字节),分别是内存起始地址8个字节,长度8个字节,容量8字节

2.1 构造方式一:声明

var ints []int


image.png

2.2 构造方式二:make

ints := make([]int, 0, 5)


image.png

2.3 构造方式三:new

ints := new([]int)


image.png

2.4 append操作

有如下功能:

  1. 扩容
  2. 最加到底层数组中

oldCap为老数组的长度,cap为期望的长度(比如oldCap为2,现在要加3个新元素,则cap为5),newCap为新的长度,扩容逻辑:

如果oldCap *2 < cap,则newCap = cap
如果oldCap < 1024,则newCap = 2 * oldCap
否则扩容1/4,newCap = oldCap * 1.25
还没有确定完,因为还涉及到go的内存分配,go将内存分成规格不同的内存单元,8B、16B、32B、48B...,比如此时oldCap为2,现在要加3个新元素,则newCap为5,元素类型为int,则需要40B,但是go会分配48B,所以newCap为6

2.5 底层数组的重用

ints := []int{1, 2,  3}
ints2 := ints[1:]

此时ints2会重用ints底层数组,此时ints2的起始地址变为指向元素2的地址,len为2,cap不变;

你可能感兴趣的:(基础知识一:string与slice)