golang社招面试总结(一)|周末学习

本文已参与周末学习计划,点击链接查看详情:juejin.cn/post/696572…

先描述一下背景。今年5月中旬入职了现在的公司,base北京。之前作为2019届的应届生在武汉的一家公司工作了不到两年。4月上旬有了换工作的想法,这个想法来的非常不合时宜,其中最有风险的一条是之前没有做任何面试准备。现在入职了两周左右了,整理一下当时经历的面试题目吧,给之后的学习提供点线索,也欢迎大家来讨论。

golang

基础相关

  1. var和:=来定义变量有什么不同?new和make初始化变量有什么不同呢?
  2. defer是做什么用的,如果一个程序里面有多个defer会怎么样?
  3. 切片的底层是怎么实现的?interface的两种用法了解吗?了解interface的底层实现吗?
  4. 怎么用的map,会有并发问题吗?怎么求一个map的长度(len就可以,害)。sync.Map可以用len来求长度吗?(应该是想要问sync.Map的底层吧)
  5. 有缓冲和无缓冲channel的区别
  6. select中如果没有default会出现什么情况?(select会阻塞,直到有case可以执行)case中的通道被关闭了会出现什么情况?(只有这一个的话会死循环,可以用,ok判断一下)
  7. map是有序的吗?map底层实现怎么处理hash碰撞的问题?
  8. recover和panic的实现原理
  9. 是否了解反射
  10. 普通的map加锁使用与直接用sync.map有什么区别?(分别说了使用上和性能上)

并发相关

  1. golang协程的调度,聊聊对GMP模型的理解
  2. 怎么实现并发?
  3. 怎么让协程等待?
  4. 聊聊goroutine泄漏?怎么避免和排查goroutine泄漏的问题?
  5. goroutine的状态机
  6. 聊聊channel的特性,从nil的channel中取数据会发生什么?

其他

  1. 哪些情况下会panic?所有的panic都可以recover吗?recover函数的使用过程,是怎么捕获的?
  2. context是做什么用的?
  3. 有什么办法可以获得函数调用的链路?
  4. 怎么处理协程运行的超时问题?
  5. 怎么优雅地关闭通道?
  6. 从面向对象的角度聊聊java和golang的区别
  7. golang的GC
  8. golang的http路由实现懂吗,可以描述一下吗?
  9. golang程序hang住了可能是什么原因(说了可能死循环导致无法GC,golang1.13),怎么排查(可以用pprof)

数据结构

  1. 数组查找的时间复杂度是多少,为什么?
  2. 了解跳表吗?
  3. 你知道哪些树结构,各自的优缺点分别是什么?(回答的时候再回答一下应用场景就更好了)

操作系统

  1. 用过锁吗?读写锁加读锁的时候会阻塞写操作吗?会阻塞读操作吗?(用过,会,不会)

Linux

  1. 用过ps命令解决过什么问题吗?查询出来的结果各个字段有什么含义?
  2. 了解僵尸进程吗?怎么避免?
  3. 怎么根据pid获取父进程的pid(回答说去/proc下面),怎么根据pid找执行路径呢?怎么根据端口号找pid(回答说lsof -i,用netstat也可以但是我不知道,面试官补充的)

数据库

  1. Redis和MySQL的区别,什么时候用Redis,什么时候用MySQL(这里我说了下我们服务用到的场景)?如果让你设计一个秒杀系统,要怎么设计?(面试官后来提示了一下说redis又一个自增key)

MySQL

  1. 有几种隔离级别?默认级别是什么?可重复读是怎么解决幻读的?了解mvcc嘛?下面几种mysql哪个会用到联合索引
Select * from table where a=1 and b=1 and c=1;
Select * from table where a=1 and b>1 and c=1;
Select * from table where a=1 and b>1 order by c
复制代码
  1. mysql为什么用B+树而不是红黑树
  2. 有一个表,id字段是唯一的,name字段可以重复。写一个SQL语句,查询出所有的name重复的记录。(大致说了select group_concat(id) from xxx group by name)
  3. MySQL中用的索引引擎是什么(innodb),让我说一下innodb的实现(b+树)为什么用b+树而不是红黑树或者b树(红黑是二叉,b树多余存储了业务数据)b+树的搜索时间复杂度(O(logn))。innodb是表锁还是行锁(这个没答上,后面多看看吧,行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁)

Redis

  1. 缓存击穿怎么办?布隆过滤器怎么实现?
  2. 有哪几种结构,跳表是用来实现什么的,sds了解吗
  3. redis。用过哪些结构,回答说只用过string。也看过一些用List的(judge、alarm和smsgateway就用过),lpush、lpop是一对吗?
  4. redis是怎么设置过期时间的?

coding

  1. 实现集合
  2. 用数组实现队列
  3. 下面代码的输出
x := []int{1,2,3}
Func(arr []int){
    arr[0] = 7
    arr = append(arr, 100)
    arr = append(arr, 101)
    fmt.Println(arr)
}(x)
fmt.Println(x)
复制代码
  1. 数据到达100个就发送,如果超过了一定时间还没到100个,也发送掉。
  2. 写一段程序。任务数m个,最大并发是n。有一个任务执行出错所有的goroutine都退出。

算法

  1. 五子棋判赢
  2. 数组中查找重复的数字。长度是n,数组中数字是小于n的非负整数
  3. 最大子序和
  4. 25匹马,5个赛道,需要几次才能得到前三名
  5. 双向链表,每两个反转一下
  6. 浏览器前进后退,怎么设计?(用两个栈)
  7. 快排
  8. 二分查找
  9. 10个ip,3个ip是重复的,乱序ip,并且输出乱序后的ip,要求是:重复的ip不会相邻
  10. 验证一个字符串是不是浮点数
  11. 被三整除的最大和

其他

  1. 从浏览器输入一个url到最后显示页面,中间都发生了什么,越详细越好
  2. 流量劫持懂吗?比如输入baidu.com最后导向了xiaomi.com(诚实说了不懂)
  3. 开放性题目:给一个小时时间,站在公司门口观察,最后预估一天内有多少来面试的人。