[toc]
1. string的底层结构
图最清楚了,对于一个string类型的变量,在64位系统中,占用内存大小为16个字节,分别是内存起始地址8个字节,长度8个字节
2. slice的底层结构
一个slice的变量,在64位系统中,占用内存大小为24个字节(实际占用为32个字节,这是因为go内存管理单元没有24字节,最接近的为32字节),分别是内存起始地址8个字节,长度8个字节,容量8字节
2.1 构造方式一:声明
var ints []int
2.2 构造方式二:make
ints := make([]int, 0, 5)
2.3 构造方式三:new
ints := new([]int)
2.4 append操作
有如下功能:
- 扩容
- 最加到底层数组中
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不变;