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调度器,其中
P和M是1:1关系,但是会存在M>=P的情况
G的创建会优先保存到P的本地队列上,如果P的本地队列已满则扔到全局队列。当一个G要执行时,则M上运行的goroutine切换为G0,G0负责调度时协程的切换,会优先从P的本地队列取到G,如果本地队列为空,则从全局队列或者其他P的队列偷取G,并开始运行G。
3.并发题:滴滴app的场景,主页同时渲染三个数据
我回答用sync.WaitGroup+ctx.WithTimeOut+AfterTime+select
面试官实际想说用channel去处理
1. mysql的慢查询
2. redis有哪些常用的数据结构和对应使用场景
3. list和set有什么区别
4. 对set中add一个已有的元素,那它是报错还是覆盖?
答:将一个或多个 member
元素加入到集合 key
当中,已经存在于集合的 member
元素将被忽略
5. redis它是一个单线程的,那他是怎么处理网络并发请求的
6. 你详细介绍下怎么多路复用(我回答了epoll的三个函数和对应的底层原理)
7. 如果访问一个大key那么会不会阻塞后面的请求
答:会
8. 你在使用过程中有出现这种情况吗