面试之滴滴
admin
2024-02-12 10:24:56

滴滴1面

Go

1.语法题

func fun() {s1 := [3]int{1, 2, 3}s2 := [3]int{1, 2, 3}b := (s1 == s2) // 能不能执行成功,如果能结果是什么fmt.Print(b)	// 答:可以比较返回false,原因数组的长度固定,可以每个元素比较ss1 := []int{1, 2, 3}ss2 := []int{1, 2, 3}b = (ss1 == ss2) // 能不能执行成功,如果能结果是什么fmt.Print(b)	// 答:不可以比较,原因切片长度不固定,无法比较var m1 map[string]intm1["one"] = 1	m2 := make(map[string]int)m2["one"] = 2b = (m1 == m2) // 能不能执行成功,如果能结果是什么fmt.Print(b)	// 答:会panic,m1是空指针。且map不能比较,原因map的hash结构不一样,是无序的m3 := make(map[string]int)m3["one"] = 1m3["two"] = 2m3["three"] = 3for key, _ := range m3 {fmt.Print(key) // 输出结果是什么// 随机输出,因为map无须}for key, _ := range m3 {fmt.Print(key) // 结果会跟上面一样吗// 不一样,遍历map是无序}for key, _ := range m3 {fmt.Print(key) // 结果会跟上面一样吗// 不一样,遍历map是无序}
}

2.go的协程调度机制

基于CSP并发模型开发了GMP调度器,其中

  • G(Goroutine) : 每个 Goroutine 对应一个 G 结构体,G 存储 Goroutine 的运行堆栈、状态以及任务函数
  • M(Machine): 对OS内核级线程的封装,数量对应真实的CPU数(真正干活的对象).
  • P (Processor): 逻辑处理器,即为G和M的调度对象,用来调度G和M之间的关联关系,其数量可通过 GOMAXPROCS()来设置,默认为核心数。

P和M是1:1关系,但是会存在M>=P的情况

G的创建会优先保存到P的本地队列上,如果P的本地队列已满则扔到全局队列。当一个G要执行时,则M上运行的goroutine切换为G0,G0负责调度时协程的切换,会优先从P的本地队列取到G,如果本地队列为空,则从全局队列或者其他P的队列偷取G,并开始运行G。

3.并发题:滴滴app的场景,主页同时渲染三个数据

  1. 有一个协程rpc获取的个人信息
  2. 有一个协程rpc获取你所在位置附近地理信息
  3. 有一个协程rpc获取其他的功能(我的订单,历史记录等等)
  4. 要求以上三个rpc数据都放到同一个队列(假设能放到同一个队列),而且需要有超时保护,防止一次rpc等待太久,无法渲染主页

我回答用sync.WaitGroup+ctx.WithTimeOut+AfterTime+select

面试官实际想说用channel去处理

Mysql/Redis

1. mysql的慢查询

2. redis有哪些常用的数据结构和对应使用场景

3. list和set有什么区别

  1. list是可以重复的,set不可重复
  2. list支持顺序读写,set随机读写

4. 对set中add一个已有的元素,那它是报错还是覆盖?

答:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略

5. redis它是一个单线程的,那他是怎么处理网络并发请求的

6. 你详细介绍下怎么多路复用(我回答了epoll的三个函数和对应的底层原理)

7. 如果访问一个大key那么会不会阻塞后面的请求

答:会

8. 你在使用过程中有出现这种情况吗

相关内容

热门资讯

巡湘记荣登2025第九届中华餐... 2025年11月13日,上海新国际博览中心见证了餐饮界的一场盛会——“2025第22届中华餐饮双创论...
一盘椰子酥烘焙出生活甜香 周末的午后,阳光透过烤箱玻璃洒进厨房,母亲正将揉好的面团擀成薄片,空气中弥漫着黄油与椰蓉的香甜气息。...
映在五角枫林里的京蒙协作情 初冬的内蒙古科尔沁草原银装素裹,一片静谧。刚刚忙活了一秋的牧民吴双龙,高兴地给记者算起账来:“以前守...
映在五角枫林里的京蒙协作情 映...   初冬的内蒙古科尔沁草原银装素裹,一片静谧。刚刚忙活了一秋的牧民吴双龙,高兴地给记者算起账来:“以...