基于Go-1.17。一些研究Go数组的自问自答,可以考虑作为面试题
![3d64f19485f4b7b23e06bacb6275ec2b.png](https://img-blog.csdnimg.cn/img_convert/3d64f19485f4b7b23e06bacb6275ec2b.png)
所有代码基于Go-1.17。一些研究Go数组的自问自答,可以考虑作为面试题。
问题:静态存储区是什么?和堆/栈有什么区别?
回答:
可以参考下列图
![e4b30a13574031d0110eb50a6030c9fa.png](https://img-blog.csdnimg.cn/img_convert/e4b30a13574031d0110eb50a6030c9fa.png)
堆上存放new产生的大块内存
栈上存放的是程序运行的时候使用的局部变量内存
代码段和数据段可以统一称为静态存储区
代码段存放的就是程序的二进制文件
数据段存放的包含三个部分:
只读数据段
一般是const修饰的变量,不需要修改的
已初始化的读写数据段
已初始化的全局变量
已经初始化的静态局部变量
未初始化段
未初始化的全局变量
未初始化的静态变量
问题:数组的初始化是在栈上,还是在数据段上的?
回答:
如果是非字面量数组类型,会在栈上初始化
如果是字面量类型:
当元素少于或者等于4个的时候,会直接将数组元素在栈上初始化
当元素大于4个的时候,会在数据段初始化,在使用的时候,复制到栈上
具体可以参考
cmd/compile/internal/walk/complit.go的 anylit
![c6f8a1d289cf4f78daac0c92e1fab54b.png](https://img-blog.csdnimg.cn/img_convert/c6f8a1d289cf4f78daac0c92e1fab54b.png)
问题:数组的结构是什么样子的?
数组在内存中是一段连续的内存。
它的类型为:
![dea880b538817662c21596faf9c8b3e5.png](https://img-blog.csdnimg.cn/img_convert/dea880b538817662c21596faf9c8b3e5.png)
里面存放了Bound,元素个数,和Elem 单个元素的类型。
问题:go访问数组的下标越界是运行时候发现的还是编译期发现的?
回答:
两个阶段都有可能,对于可以静态检测出来的,在编译器就会报错。
比如代码:
![1f54dfb5dbb813775120135e1d7aa3cf.png](https://img-blog.csdnimg.cn/img_convert/1f54dfb5dbb813775120135e1d7aa3cf.png)
![d52f3500153c2bb7bdc912cfaf24a399.png](https://img-blog.csdnimg.cn/img_convert/d52f3500153c2bb7bdc912cfaf24a399.png)
具体使用的是 cmd/compile/internal/typecheck/expr.go 的 tcIndex 方法
![88810f96361b58a06438fde26e90b62d.png](https://img-blog.csdnimg.cn/img_convert/88810f96361b58a06438fde26e90b62d.png)
但是如果是使用变量下标来访问,就只能在运行期间来判断是否越界。通过汇编码大致能看到最后调用panicIndex
![7fac694cacd642058d754e547fa000f8.png](https://img-blog.csdnimg.cn/img_convert/7fac694cacd642058d754e547fa000f8.png)
![28cfa95584eae06f673734c9d1bde72c.png](https://img-blog.csdnimg.cn/img_convert/28cfa95584eae06f673734c9d1bde72c.png)
![de6f9e85dd20c553846dc91e34967afb.png](https://img-blog.csdnimg.cn/img_convert/de6f9e85dd20c553846dc91e34967afb.png)
参考
https://blog.csdn.net/chen1083376511/article/details/54930191
Hi,我是轩脉刃,一个名不见经传码农,体制内的小愤青,躁动的骚年,2021年想坚持写一些学习/工作/思考笔记,谓之倒逼学习。欢迎关注个人公众号:轩脉刃的刀光剑影。
MORE | 更多原创文章