首页 > 编程语言 >go源码学习(一):数据结构-数组

go源码学习(一):数据结构-数组

时间:2022-11-28 20:11:43浏览次数:47  
标签:检查 元素 越界 访问 源码 内存 数组 go 数据结构

数组是相同类型元素的集合,在内存中对应一块连续的内存空间。数组类型是通过存储的元素类型以及能够存储的大小两个维度来决定的,一旦声明之后大小就不可更改。

初始化

go语言数组的声明有两种方式

arr1 := [3]int{1,2,3}
arr2 := [...]int{1,2,3}

arr2只是arr1的一种语法糖,让编译器为我们推算出数组的长度,而不需要让我们显式指定。它们的本质是一样的,不同点在于显式指定大小可以在类型检查的时候就创建出对应的数组,后一种方式需要在推断出数组长度之后再创建出数组,仅此而已。

对于使用字面量初始化的数组,编译器在初始化字面量的函数anylit会进行优化。

  1. 当元素数量小于等于4个时,会直接将数组中的元素放到栈上。
  2. 当元素数量大于4个时,会将数组中的元素放到静态存储区并在运行时取出。

这样设计的原因也并不太清楚,可能是为了当数据元素很多的时候能够直接将数据从静态存储区拷贝到栈上(直接从一块内存拷贝到另一块内存),可以节省很多时间而不用一个元素一个元素地赋值。

访问

数据通过下标进行访问,并且由于数组的长度是固定,发生越界访问是非常严重的错误。所以go语言提供了越界检查的能力。
越界检查分为编译期检查和运行期检查。

当使用常量作为下标访问数组元素的时候,越界检查就是编译期进行的。因为在编译期间我们就能够知道数组的长度,以及访问的下标从而判断是否发生越界,就能够避免在运行期进行检查了,可以提高程序运行的效率。

但是,如果作为下标的是一个会随着程序运行而改变的变量的话,那么就必须在运行期进行检查了。对于这种情况,编译器会在生成中间代码的时候在数组访问的地方插入用于越界检查的指令。当发现越界,程序就会崩溃。

赋值

对于越界检查来说,访问和赋值并无区别。检查失败程序都会崩溃,不同的是检查通过后,访问是从指定的内存读取元素,而赋值是将指定内存的值更改为另一个值

标签:检查,元素,越界,访问,源码,内存,数组,go,数据结构
From: https://www.cnblogs.com/smarticen/p/16925802.html

相关文章

  • Android Google开源库——Volley的简单使用
    介绍一下AndroidGoogle开源库——Volley的简单使用volley 项目地址 ​​https://github.com/smanikandan14/Volley-demo​​JSON,图像等的异步下载;网络请求的排序(sc......
  • 【779】R语言数据结构
    1.向量向量从数据结构上看就是一个线性表,可以看成一个数组。c()是一个创造向量的函数。R语言中的"下标"不代表偏移量,而代表第几个,也就是说是从1开始的!seq......
  • SpringBoot 自动装配源码解析
    SpringBoot自动装配源码解析step1:SpringApplication.run(ZylSpringBootApplication.class,args);step2:this.refreshContext(context);-->org.springframework.bo......
  • jQuery插件FullCalendar日程表实现可扩展Google日历功能
    这个介绍jQuery日历FullCalendar插件是一个非常不错的日历工具,可用于制作日程表或计划安排等,可扩展Google日历功能,制作个性化的日程表,同时可绑定点击事件或拖动事件,使用非常......
  • Django视图中的请求与响应
    一请求一限制http请求视图中的request,实际上是django源码中的HTTPRequest的子类WSGIRequest类的实例对象,主要由django对客户端请求的http协议报文进行解析后得到的请求......
  • Pycharm 搭建 Django 项目
    1.安装需求在使用python框架Django需要注意下面事项Pycharm版本是专业版而不是社区版本Pycharm配置好了python解释器(一般我们现在用的都是python3)我自己使......
  • 6.go中的派生/复杂数据类型
    1.指针1.基本数据类型也叫值类型,在内存中存储值,指针类型一个地址,地址指向的空间存储的值才是        2.&,获取地址2.数组3.结构体......
  • jsp源码实例2(获取表单参数)
    jsp源码实例2(获取表单参数)packagecoreservlets;importjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;importjava.util.*;/**Showsallthep......
  • pinia源码解读二(定义模块)
    定义模块store.ts文件的defineStore方法判断是option写法还是setup写法isSetupStore=typeofsetup==='function'内部创建useStore函数,并给函数绑定$id属性为用......
  • Vue 2.x源码学习:render方法、模板解析和依赖收集
    众所周知,Vue的脚手架项目是通过编写.vue文件来对应vue里组件,然后.vue文件是通过vue-loader来解析的,下面是我学习组件渲染过程和模板解析中的一些笔记。之前的笔记:应用初......