快速理解Go数组和切片的内部实现原理

本文详细介绍了Go语言中数组和切片的区别与联系,强调了数组作为值类型的特点,以及切片的三个属性:长度、容量和指向数组的指针。文章通过逻辑图展示了切片的不同初始化方式,并探讨了切片的扩容机制,包括扩容规则和对原数组的影响。同时,提到了空切片和nil切片的差异,以及如何进行扩容操作。最后,鼓励读者通过实践和讨论加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多人对Go语言的arrayslice傻傻分不清楚,今天我们就从底层出发,来聊聊它俩到底有什么区别。

数组

几乎所有计算机语言,数组的实现都是相似的:一段连续的内存,Go语言也一样,Go语言的数组底层实现就是一段连续的内存空间。每个元素有唯一一个索引(或者叫下标)来访问。如下图所示,下图是[5]int{1:10, 2:20}数组的内部实现逻辑图:

这里写图片描述

由于内存连续,CPU很容易计算索引(即数组的下标),可以快速迭代数组里的所有元素。
Go语言的数组不同于C语言或者其他语言的数组,C语言的数组变量是指向数组第一个元素的指针;而Go语言的数组是一个值,Go语言中的数组是值类型,一个数组变量就表示着整个数组,意味着Go语言的数组在传递的时候,传递的是原数组的拷贝。你可以理解为Go语言的数组是一种有序的struct

slice

切片是一个很小的对象,是对数组进行了抽象,并提供相关的操作方法。切片有三个属性字段:长度、容量和指向数组的指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

菜刚

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值