腾讯不愧是大厂,面试太难了
今天分享一篇腾讯的面经,面经的主人公有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 包允
