[面试题~] Golang

简介: [面试题~] Golang

1. 逃逸分析

1.1 逃逸分析是什么?

编译原理中,分析指针动态范围的方法称之为逃逸分析。在Go中的表现是,如果一个对象的指针被多个方法或线程引用时,则称这个指针发生了逃逸。

所以,我认为逃逸分析指的是,通过分析变量的指针作用范围,来决定这个变量是分配在堆上还是栈上。

1.2 逃逸分析的作用是什么?

通过逃逸分析,可以把那些不需要分配在堆上的变量直接分配到栈上,堆上的变量少了,会减轻堆内存分配的开销,同时减少 GC 的压力,提高程序的运行速度。

1.3 逃逸分析是怎么完成的?

首先,Go语言逃逸分析的最基本的原则是:如果一个函数返回对一个变量的引用,那么这个变量就会发生逃逸。

其次是,编译器会分析代码的特征和代码的生命周期,Go 中的变量只有在编译器可以证明函数返回后是否会被引用。

简单地说,编译器会根据变量是否被外部引用来决定是否逃逸。

  1. 如果变量在函数外部没有引用,则优先放在栈上。
  2. 如果变量在函数外部存在引用,则必定放在堆上。

1.4 如何确定一个变量是否发生逃逸?

可以在编译的时候,启用编译器的额外支持,-gcflags输出编译器的优化细节,其中包含了逃逸分析的变量提示。

1.5 把变量分配到栈上和堆上有什么区别?

堆和栈相比,堆适合不可预知大小的内存分配。但是为此付出的代价是分配速度较慢,而且会形成内存碎片。栈内存分配则会非常快。栈分配内存只需要两个CPU指令:“PUSH”和“RELEASE”,分配和释放;而堆分配内存首先需要去找到一块大小合适的内存块,之后要通过垃圾回收才能释放。

2. goroutine

2.1 为什么无法从父 goroutine 中恢复子 goroutine?

因为 goroutine 被设计为一个独立的代码执行单元,拥有自己的执行栈,不与其他 goroutine 共享任何数据。也就是说,无法让 gorourine 拥有返回值,也无法让 goroutine 拥有像 pid 那样的唯一 id 标识。


相关文章
|
11天前
|
Go
golang力扣leetcode 面试题04.06.后继者
golang力扣leetcode 面试题04.06.后继者
29 0
|
NoSQL 网络协议 关系型数据库
golang面试题整理
在2020便宜云服务器峰会上,便宜云服务器智能总裁张建锋表示,便宜云服务器今年再招5000人,大规模引进顶尖科技人才。7月9日 19:00-21:30 便宜云服务器开发者社区首场“Offer 5000”直播开启!15位团队技术大牛在线招人,《便宜云服务器技术面试红宝书》助你拿下Offer!马上投递简历: /special/offerday01,在此,小编奉上golang面试题,帮你拿下好工作!
13123 0
golang面试题整理
|
11天前
|
Go
golang力扣leetcode 面试题01.05.一次编辑
golang力扣leetcode 面试题01.05.一次编辑
27 0
|
11天前
|
存储 JSON 安全
[面试题~]Golang
[面试题~]Golang
|
11天前
|
存储 缓存 Java
Golang面试题从浅入深高频必刷「2023版」
Golang面试题从浅入深高频必刷「2023版」
|
9月前
|
Go
golang面试题:对已经关闭的的chan进行读写,会怎么样?为什么?
golang面试题:对已经关闭的的chan进行读写,会怎么样?为什么?
175 0
|
12月前
|
算法 Java Go
|
11天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
70 0
http://www.vxiaotou.com