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

image-20211227100817481

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

问题:静态存储区是什么?和堆/栈有什么区别?

回答:

可以参考下列图

image-20211218150130046

堆上存放new产生的大块内存

栈上存放的是程序运行的时候使用的局部变量内存

代码段和数据段可以统一称为静态存储区

代码段存放的就是程序的二进制文件

数据段存放的包含三个部分:

  • 只读数据段

    • 一般是const修饰的变量,不需要修改的

  • 已初始化的读写数据段

    • 已初始化的全局变量

    • 已经初始化的静态局部变量

  • 未初始化段

    • 未初始化的全局变量

    • 未初始化的静态变量

问题:数组的初始化是在栈上,还是在数据段上的?

回答:

如果是非字面量数组类型,会在栈上初始化

如果是字面量类型:

当元素少于或者等于4个的时候,会直接将数组元素在栈上初始化

当元素大于4个的时候,会在数据段初始化,在使用的时候,复制到栈上

具体可以参考

cmd/compile/internal/walk/complit.go的 anylit

image-20211218152252710

问题:数组的结构是什么样子的?

数组在内存中是一段连续的内存。

它的类型为:

image-20211218215546289

里面存放了Bound,元素个数,和Elem 单个元素的类型。

问题:go访问数组的下标越界是运行时候发现的还是编译期发现的?

回答:

两个阶段都有可能,对于可以静态检测出来的,在编译器就会报错。

比如代码:

image-20211219084151251

image-20211219084158297

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

image-20211218153433719

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

image-20211219083906619

image-20211219083928625

image-20211219084008572

参考

https://blog.csdn.net/chen1083376511/article/details/54930191

Hi,我是轩脉刃,一个名不见经传码农,体制内的小愤青,躁动的骚年,2021年想坚持写一些学习/工作/思考笔记,谓之倒逼学习。欢迎关注个人公众号:轩脉刃的刀光剑影。

MORE | 更多原创文章

Golang 数组的一些自问自答相关推荐

  1. 干货!JAVA容器-自问自答学HashMap

    前言 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里面蕴含着很多知识点,可以很好的考察个人基础.但一个这么重要的东西,我为什么没有在一开始 ...

  2. JAVA容器-自问自答学HashMap

    前言 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里面蕴含着很多知识点,可以很好的考察个人基础.但一个这么重要的东西,我为什么没有在一开始 ...

  3. [python]自问自答:python -m参数? (转)

    python -m xxx.py 作用是:把xxx.py文件当做模块启动 但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答: ...

  4. 分享蔡澜老师的自问自答

    蔡澜老师的个人网站上有个「访问自己」的板块,里面记录了很多蔡澜老师的「自问自答」,问题和回答都很有趣,从中挑选了一部分.喜欢这种洒脱率真的生活态度. 附上网址 http://blog.sina.com ...

  5. Maven 自问自答

    Maven 自问自答 Maven 自问自答 maven有什么用 POM 是一个什么东西 解读pom Build Lifecycle maven 三条指令运行web项目 maven常用指令 maven结 ...

  6. vue 源码自问自答-响应式原理

    vue 源码自问自答-响应式原理 最近看了 Vue 源码和源码分析类的文章,感觉明白了很多,但是仔细想想却说不出个所以然. 所以打算把自己掌握的知识,试着组织成自己的语言表达出来 不打算平铺直叙的写清 ...

  7. RT_Thread自问自答

    在看韦东山老师"RT-Thread内部机制"的视频,挺有意思的,有些概念的理解还是要深究一下,不然可能就是"我知道,这不就是那个....那个....那个",哪个 ...

  8. Golang 数组的简单操作之合并数组与删除某个索引的值

    Golang 数组的简单操作之合并数组与删除某个索引的值 Golang轻松学习 文章目录 Golang 数组的简单操作之合并数组与删除某个索引的值 一.接口数组([]interface{})是什么? ...

  9. golang 数组与切片

    通过下面几个问题来更好理解golang 的数组和切片 类型 数组是值类型,将一个数组赋值给另一个数组时,传递的是一份拷贝. 切片是引用类型,切片包装的数组称为该切片的底层数组. 我们来看一段代码 // ...

最新文章

  1. Dataguard failover切换应用redo操作
  2. java邮件教程_Java发送Email/邮件
  3. java+queue+se_「013期」JavaSE面试题(十三):多线程(3)
  4. 【Python】元组和列表相关知识总结
  5. 利用 Windows 子系统 Linux(WSL)开发 Python 环境搭建
  6. Go语言:运行代码报错main redeclared in this block previous declaration at .\test.go:5:6
  7. weblogic 下载和安装
  8. 苏大计算机考研专业课,苏州大学计算机考研初试经验分享
  9. HYSPLIT 模型 传输轨迹 使用指南
  10. 机器学习在社会科学中的应用
  11. UPS电源设备消防与电气安全要求
  12. cer证书生成以及签名验签详细篇(keytool 命令)
  13. VML实例-拖动效果
  14. 长城汽车召回上万辆欧拉IQ:电池存在安全隐患,曾因自燃被拉黑
  15. 【英语语法入门】第44讲 假设(03)与过去事实相反的虚拟语气
  16. 数字IC笔试题,大疆校招16题(仅供参考)
  17. 《 孙子兵法 》“势”论的美学探析
  18. 用 Python 编程,假设一年期定期利率为 3.25%,计算一下需要过多少年,一万元的一年定期存款连本带息能翻番?
  19. 连入网络中的计算机必须都是,12计算机网络判断题.doc
  20. 2019互联网岳麓峰会”区块链分会场—长沙率先推出区块链公共服务平台

热门文章

  1. H5/C3基础(1)
  2. 生态对对碰|云和恩墨数据库云管平台 zCloud 最新支持 TiDB
  3. document打印
  4. Openpose Windows10环境并且是3系显卡+ Unity 环境部署
  5. 秒数转换为天小时分钟秒的格式
  6. 基本模块 time datetime randon os sys subprocess 打印进度条
  7. np.randon模块,numpy.random模块各函数功能详解,分类描述各个函数功能,生成随机数
  8. 六种找客户的方法销售人员需掌握
  9. Linux入门---环境搭建(腾讯云服务器)、XShell远程登陆Linux
  10. 鬼吹灯java攻略_密室逃脱鬼吹灯攻略完美过关图文详解