基础知识一: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不变;

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

相关阅读更多精彩内容

友情链接更多精彩内容