go design (一) array
golang 中 array 的实现
数组是由相同类型元素的集合组成的数据结构。
计算机操作系统会为数组分配一块连续的内存来保存其中的元素,我们可以利用数组中元素的索引快速访问特定元素 。
常见的数组大多都是一维的线性数组。多维数组在数值计算和图形应用方面非常有用。
golang
中 对于数组的实现 array
1 |
|
- 由源码可以了解编译前的
golang
中的array
由elem
(任意类型元素Type
) 跟bound
元素个数 组成,type.Width
代表了此元素的长度。知道数组的元素个数,元素的起始位置,每个元素的长度之后,后续的对于数组的操作就简单了。 - 对于元素类型一致但声明
bound
不一致array
是不可比较的
array 的初始化
1 |
|
- 对于 […] 声明的数组,底层会自动推导
bound
并转成 上一种声明方式
访问与赋值
- 数组的长度固定,那么对于简单的越界操作,编译时就能发现
1 |
|
- 而对于变量去替代索引的情况,就只能由运行时去判定
1 |
|
- 如何证明array在内存中的连续性?
1 |
|
- 很显然 数组中每一位的地址 相差为 10 进制的 8 ,那就是说在我64位的机器上 int 为 8字节
数组是程序中最基础的结构之一,知道索引时,其 O(1)
的读写速度也十分优秀,但其定长的特性,注定了灵活性的不足。golang
中 我们使用最多的 slice
,但其底层也是依赖于array
。
下一篇, 我们一起看看 slice
的设计与实现。
- 相关参考
go design (一) array
https://blogxy.cn/posts/a5d408b/