go语言数组系列

1,505 阅读2分钟

「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」。

前言

数组是一种编程中常用的数据结构,go语言中,既有可以改变长度的切片,也有初始化后就不能修改长度的数组。本文来聊下数组的特点

数组的几个特点

数组是一块连续的存储区域。 内存连续的好处是:

  • CPU能把数据缓存更久的时间。
  • 容易计算索引,可以快速迭代元素。

和其他语言不同的是,go语言的数组不能进行扩容。无论是调用函数时作为参数传递还是b=a这种类型的复制,都是值复制。这意味着长度大的数组需要尽量避免复制和作为函数参数的情况,避免消耗内存。

数组初始化

go语言数组可以

[...]int{234}

用如下方式初始化,但是分配内存时需要知道数组具体的长度,对长度的判断,包括对索引越界(仅限常量)的判断,都是在编译时完成的。

当我想查看源码的时候发现go1.17的时候,并没有找到相关代码,只是在网上查到了旧版本的资料。我们查看源码如下

截屏2022-02-15 下午11.12.08.png

该函数调用 typecheckarraylit——通过遍历元素的方式来计算数组中元素的数量。

编译时优化

众所周知,数组作为一个连续的存储空间,势必对连续空白内存有需求。如果数组长度很大时,还将数组存放在栈中,显然是不合时宜的,因此在数组长度大于4时,数组会被放置到内存的静态只读区。但当数组长度不大时,放入静态只读区就会造成性能过低,因此会将数组放入栈中。