服务端面试之GO(二)

实战手撕代码之Channel、并发等

Posted by BX on Sun, May 4, 2025

ROUND-1

机制类

题号类型面试点核心
1️⃣机制题为什么 map 遍历是乱序的?请描述 Go map 内部的 bucket 和扩容机制,为什么选择 lazy deletion?
2️⃣机制题Goroutine 是如何被调度的?解释 P 的工作窃取机制,以及为什么 M 数可以大于 GOMAXPROCS?
3️⃣机制题为什么 sync.Map 能支持并发读写?它是如何避免锁竞争的?与普通 map+mutex 的比较?
4️⃣机制题select 中多个 case 竞争时是否公平?Go runtime 是如何选择执行分支的?如何避免饥饿?
5️⃣机制题为什么 Go 中的函数参数在某些情况下会逃逸到堆上?逃逸分析做了哪些判断?

实战类

题号类型面试点核心
6️⃣实战题写一段代码展示 sync.Once 被多个 goroutine 并发调用的场景,并解释为什么一定要使用原子变量加锁配合
7️⃣实战题给出一段代码,slice append 后原始 slice 被修改,请分析原因并解释底层机制
8️⃣实战题写一段代码,使用 atomic.Pointer[T] 实现一个单例对象的安全发布。需要保证构造也只发生一次
9️⃣实战题写一段能触发 fatal error: concurrent map read and map write 的代码,并解释为何即便读写不重合也会 panic
🔟实战题channel 实现一个一写多读的广播机制(不能用 sync.Cond),要求读方不会丢事件