深入学习go语言(一):数据结构-数组
数组是相同类型元素的集合,在内存中对应一块连续的内存空间。数组类型是通过存储的元素类型以及能够存储的大小两个维度来决定的,一旦声明之后大小就不可更改。
初始化
go语言数组的声明有两种方式
arr1 := [3]int{1,2,3}
arr2 := [...]int{1,2,3}
arr2只是arr1的一种语法糖,让编译器为我们推算出数组的长度,而不需要让我们显式指定。它们的本质是一样的,不同点在于显式指定大小可以在类型检查的时候就创建出对应的数组,后一种方式需要在推断出数组长度之后再创建出数组,仅此而已。
对于使用字面量初始化的数组,编译器在初始化字面量的函数anylit会进行优化。
- 当元素数量小于等于4个时,会直接将数组中的元素放到栈上。
- 当元素数量大于4个时,会将数组中的元素放到静态存储区并在运行时取出。
这样设计的原因也并不太清楚,可能是为了当数据元素很多的时候能够直接将数据从静态存储区拷贝到栈上(直接从一块内存拷贝到另一块内存),可以节省很多时间而不用一个元素一个元素地赋值。
访问
数据通过下标进行访问,并且由于数组的长度是固定,发生越界访问是非常严重的错误。所以go语言提供了越界检查的能力。
越界检查分为编译期检查和运行期检查。
当使用常量作为下标访问数组元素的时候,越界检查就是编译期进行的。因为在编译期间我们就能够知道数组的长度,以及访问的下标从而判断是否发生越界,就能够避免在运行期进行检查了,可以提高程序运行的效率。
但是,如果作为下标的是一个会随着程序运行而改变的变量的话,那么就必须在运行期进行检查了。对于这种情况,编译器会在生成中间代码的时候在数组访问的地方插入用于越界检查的指令。当发现越界,程序就会崩溃。
赋值
对于越界检查来说,访问和赋值并无区别。检查失败程序都会崩溃,不同的是检查通过后,访问是从指定的内存读取元素,而赋值是将指定内存的值更改为另一个值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】