Skip to content

腾讯不愧是大厂,面试太难了

今天分享一篇腾讯的面经,面经的主人公有3年的Golang开发经验,岗位的薪资为25-30K,内容我已经整理好了,看看难度如何:

1. Go的调度机制

主要就是回答GMP模型

G-P-M 模型

  • G (Goroutine) :代表用户代码中的一个 Goroutine,是 Go 中最小的执行单元。
  • P (Processor) :每个 P 表示一个逻辑处理器,负责管理一组可运行的 goroutine。默认情况下,P 的数量等于系统的 CPU 核心数,但可以通过 runtime.GOMAXPROCS() 函数调整。
  • M (Machine) :对应于一个真实的操作系统线程,M 执行实际的代码。M 可以获取 P 来执行其上的 goroutine,当 M 阻塞时(例如进行系统调用),它会释放 P,让其他 M 获取并继续执行任务。

工作窃取调度

  • 本地队列:每个 P 拥有一个本地的工作队列,用于存放待执行的 goroutine。这减少了锁争用,提高了性能。
  • 全局队列:除了本地队列外,还有一个全局队列,用于分配新的 goroutine 给各个 P。
  • 工作窃取:当一个 M 关联的 P 上的本地队列为空时,M 会尝试从其他 P 的本地队列中“窃取”一半的任务来执行。这种机制有助于平衡负载,尤其是在多核处理器上。

2. Go的struct能否进行比较

可以,Go中的struct可以进行比较。在Go语言中,结构体类型是可以比较的,只有当结构体中的所有字段都是可以比较的类型时才可以进行比较。如果结构体中的字段包含了不可比较的类型(比如切片、map等),则结构体就不能进行比较。

在进行结构体比较时,会逐个字段进行比较,如果所有字段的值都相等,则认为两个结构体相等。需要注意的是,结构体比较是值比较,即比较的是结构体实例的具体值,而不是引用或指针

3. Go中的defer关键字使用

defer关键字在Go中用于延迟(defer)函数的执行,即在函数执行完毕后再执行defer函数。defer函数通常用于资源释放、日志记录、错误处理等场景。defer语句会在函数返回之前执行,多个defer语句按照先进后出的顺序执行。

4. select语句的用途

select语句在Go语言中主要用于实现并发控制和通信操作。通过select语句,可以在多个通信操作中选择一个进行执行,而其他通信操作将被阻塞。在Go语言中,select语句通常与channel配合使用,用于在多个channel间进行数据传输和同步操作。

5. context包的作用

1. 超时和截止时间

context 包允