Go基础:切片的地址和扩容

本文探讨了Go语言中切片的地址变化情况,揭示了在追加元素时切片容量如何自动扩容。当容量不足时,新容量通常是旧容量的两倍,但超过一定阈值后,扩容比例会变为旧容量的1/4。此外,扩容确保容量为偶数,以优化内存布局。通过示例代码展示了切片扩容的具体过程。
摘要由CSDN通过智能技术生成

切片的地址

func main() {
	var slice []int
	slice = append(slice, 1, 2, 3, 4)
	fmt.Printf("%p\n", slice)
	slice = append(slice, 1, 2, 3, 4)
	fmt.Printf("%p\n", slice)
}

运行结果:
在这里插入图片描述
切片的地址不一定是不变的。
如果切片在未扩容前后面的地址被使用了,扩容后切片的地址就可能发生变化。
在这里插入图片描述

切片的扩容

func main() {
	s := make([]int, 0, 1)
	oldcap := cap(s)
	for i := 0; i < 20000; i++ {
		s = append(s, i)
		newcap := cap(s)
		if oldcap < newcap {
			fmt.Printf("cap:%d === %d\n", oldcap, newcap)
			oldcap = newcap
		}
	}
}

运行结果:
在这里插入图片描述
在使用append追加数据的时候,长度超过容量,容量自动扩容

一般 新容量 = 旧容量 * 2
如果超过1024字节,每次扩容上一次的1/4

容量扩容必为偶数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaiSarH

如果觉得文章不错,可以支持下~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值