golang 数组的一些自问自答
所有代码基于Go-1.17。一些研究Go数组的自问自答,可以考虑作为面试题。

问题:静态存储区是什么?和堆/栈有什么区别?
回答:
可以参考下列图

堆上存放new产生的大块内存
栈上存放的是程序运行的时候使用的局部变量内存
代码段和数据段可以统一称为静态存储区
代码段存放的就是程序的二进制文件
数据段存放的包含三个部分:
- 只读数据段
- 一般是const修饰的变量,不需要修改的
- 已初始化的读写数据段
- 已初始化的全局变量
- 已经初始化的静态局部变量
- 未初始化段
- 未初始化的全局变量
- 未初始化的静态变量
问题:数组的初始化是在栈上,还是在数据段上的?
回答:
如果是非字面量数组类型,会在栈上初始化
如果是字面量类型:
当元素少于或者等于4个的时候,会直接将数组元素在栈上初始化
当元素大于4个的时候,会在数据段初始化,在使用的时候,复制到栈上
具体可以参考
cmd/compile/internal/walk/complit.go的 anylit

问题: 数组的结构是什么样子的?
数组在内存中是一段连续的内存。
它的类型为:

里面存放了Bound,元素个数,和Elem 单个元素的类型。
问题:go访问数组的下标越界是运行时候发现的还是编译期发现的?
回答:
两个阶段都有可能,对于可以静态检测出来的,在编译器就会报错。
比如代码:


具体使用的是 cmd/compile/internal/typecheck/expr.go 的 tcIndex 方法

但是如果是使用变量下标来访问,就只能在运行期间来判断是否越界。通过汇编码大致能看到最后调用panicIndex



参考
https://blog.csdn.net/chen1083376511/article/details/54930191
golang 数组的一些自问自答的更多相关文章
- golang切片的一些自问自答
你好,我是轩脉刃.这篇是关于go切片的一些问题和回答. go的切片基本上是代码中使用最多的一种数据结构了,使用这种数据结构有哪些要注意的点,这个是非常必要了解的东西.基本上,以前写的一篇博客 http ...
- [python]自问自答:python -m参数?
python -m xxx.py 作用是:把xxx.py文件当做模块启动 但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答: ...
- 自问自答之VR遐想
先让我组织一下语言,作为表达能力超弱的战五渣来讲,归纳总结什么的最要命了. 我可以给你分析个1到N条出来,但是一般来讲没什么顺序,想到什么就说什么.而且我属于线性思维,有一个引子就可以按着话头一步步发 ...
- [python]自问自答:python -m参数? (转)
python -m xxx.py 作用是:把xxx.py文件当做模块启动但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答: ...
- [python]自问自答:python -m参数? (转) ( python2.7 版本 )
原文地址: http://www.cnblogs.com/xueweihan/p/5118222.html python -m xxx.py 作用是:把xxx.py文件当做模块启动 但是我一直不明白当 ...
- css自问自答(二)
css自问自答(二) 7.掌握定位的一些属性 position 和 display 属性,以及如何浮动(float)和清除(clear)元素,z-index属性 三个属性控制: position 属性 ...
- css自问自答(一)
css自问自答(一) 1.块级元素和行内元素特性与区别? 块级:display:block <div>.<p>.<h1>...<h6>.<ol&g ...
- vue 源码自问自答-响应式原理
vue 源码自问自答-响应式原理 最近看了 Vue 源码和源码分析类的文章,感觉明白了很多,但是仔细想想却说不出个所以然. 所以打算把自己掌握的知识,试着组织成自己的语言表达出来 不打算平铺直叙的写清 ...
- 区块链自问自答 day1
区块链自问自答 day1 简要介绍区块链是什么? 区块链(Blockchain)是一种对等网络下的分布式数据库系统 数据结构中的单向链表是通过每个节点包含一个节点的指针实现"链" ...
随机推荐
- Beautiful Soup解析库的安装和使用
Beautiful Soup是Python的一个HTML或XML的解析库,我们可以用它来方便地从网页中提取数据.它拥有强大的API和多样的解析方式.官方文档:https://www.crummy.co ...
- c#Gridview添加颜色
e.Row.Cells[1].ForeColor = System.Drawing.Color.Blue;
- A Child's History of England.44
At this period of his reign, when his troubles seemed so few and his prospects so bright, those dome ...
- accent, accept
accent A colon (:) is used to represent a long vowel, e.g. sheet /ʃiːt/ and shit /ʃit/. The word bed ...
- Scala【json字符串和json对象互相转换】
一.fastjson工具 pom依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>f ...
- Swift3.0 延时执行
//延时1s执行 DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(1*NSEC_PER_SEC))/ ...
- OpenStack之五: image镜像服务(端口9292)
官网地址:https://docs.openstack.org/glance/stein/install/install-rdo.html #:创建glance库,并授权 MariaDB [(none ...
- spring boot集成mybatis框架
概述 中文官网:http://www.mybatis.cn 参考教程:https://www.w3cschool.cn/mybatis MyBatis Plus:http://mp.baomidou. ...
- java面试--(生成随机数,获取重复次数最多,并且数是最大的一个,打印出来)
import java.util.*; public class MaxRandom { public static void main(String[] args){ int[] num = new ...
- redis入门到精通系列(六):redis的事务详解
(一)事务的概念 谈到数据库的高级应用,不可避免会谈到事务.熟悉mysql的朋友们对事务肯定不陌生,简单来讲事务就是控制一个数据库操作序列要么全部执行要么全部不执行.今天我们就来了解redis中的事务 ...