wtysos11 / blogWiki

Use to store public paper and organize them.
17 stars 4 forks source link

go语言面试与回答整理 #199

Open wtysos11 opened 3 years ago

wtysos11 commented 3 years ago

虽说要准备一下go的面试,我也是真的不知道具体应该怎么准备,都看一下吧。下面的题目应该是以Go为主,以C++为辅,Java我就不卷了,人太多了……(mmp,卷到上知乎热榜,java人这么多吗)

参考资料:

算法

算法题库:

知识点

  1. 基本数据结构操作:链表、栈、堆、图、搜索
  2. 单调队列
  3. 线段树
  4. DP
  5. 红黑树
  6. 实现
  7. hash冲突解决问题
  8. map中解决hash冲突时怎么做的
  9. 10亿URL的去重(布隆过滤器)

一些题目

  1. 单链表排序,时间复杂度O(nlogn),快慢指针加归并排序
  2. 链表翻转
  3. 单链表找到中间节点(快慢指针,慢指针每次动一次,快指针动两次)
  4. 大文件排序
  5. 二叉树遍历,非递归
  6. 算法:一个序列,先增后减,找到某一个数是否在其中。 非实现类:

数据库相关

SQL类型

索引相关

面试题:mysql 一棵 B+ 树能存多少条数据? - soo的文章 - 知乎 https://zhuanlan.zhihu.com/p/379092178,索引查找过程讲的很不错

数据库加锁 我以为我对MySQL锁很熟,直到我遇到字节面试官... - 是Yes呀的文章 - 知乎 https://zhuanlan.zhihu.com/p/388691518

其他

  1. 离线排序算法
  2. SQL查询性能瓶颈出离方式
  3. SQL索引优化方式,explain字段含义
  4. ACID的特点
  5. 一个SQL语句的执行过程
  6. mysql索引慢分析:线上开启slowlog,提取慢查询,然后仔细分析explain中的tye字段以及extra字段,发生的具体场景以及mysql是如何做的
  7. mysql隔离级别与慢查询,慢读
  8. 单列索引a和b会先查询哪一个
  9. 事务是通过什么实现的?除了行锁还有什么

NoSQL

redis类型

深入理解redis-scan指令

分布式系统

计算机网络

  1. TCP的特点,三次握手与四次挥手,如何改进
  2. TCP流量控制、拥塞控制
  3. TCP半连接队列
  4. TCP半关闭状态
  5. TCPTIME_WAIT状态,time_wait时间太长会怎样
  6. TCP、UDP的区别,UDP优点,适用场景。(谷歌的新协议)
  7. http与http2的区别
  8. https连接过程
  9. https如何获取证书
  10. 网络七层模型和五层模型
  11. 输入URL后发生的整个网络过程
  12. 错误的状态码

操作系统

  1. 并发操作
  2. 死锁,死锁必要条件、死锁预防的基本方法,死锁检测
  3. 检测死锁的表可以如何实现(hashMap,或者有向无环图)
  4. 进程与线程的区别,用户态与内核态
  5. 常用限流算法。高并发限流与熔断的实现
  6. IO多路复用,poll、select与epoll,推荐这篇文章,这是我看到写IO多路复用写的最好的一篇
  7. sleep的底层实现
  8. LRU相关知识点
  9. LRU缓存实现,要求set/get操作O(1)时间复杂度
  10. 进程之间通信方式

Go语言相关

推荐资料:

  1. 协程如何实现
  2. go routine的创建数量有限制吗
  3. gpm模型
  4. go的并发机制
  5. 进程和协程的区别
  6. go的GC原理(三色标记)
  7. go性能分析工具
  8. go内存操作是如何处理IO
  9. 同一个协程中,对无缓冲channel同时发送和接受数据会发生什么问题
  10. go用共享内存的方式实现并发如何保证安全
  11. go的锁是可重入的吗
  12. 获取不到锁会一直等待吗
  13. 如何实现一个timeout的锁
  14. channel和锁的对比
  15. channel的应用场景
  16. 有缓冲和无缓冲channel的区别
  17. channel实现原理
  18. 被close的channel会有什么问题
  19. slice和array的区别
  20. 向为nil的channel发送数据会发生什么?向nil的map读取/写入键会发生什么?
  21. map取一个值后修改,原map数据的值会不会发生修改(不会,go没有引用传值)
  22. go waitgroup的坑
  23. context包的用途
  24. client是如何实现长链接的
  25. 线程池
  26. 主协程是如何等待其余协程完成后再操作
  27. slice的原理:cap、len、共享、扩容
  28. map如何进行顺序读取
  29. go的深拷贝问题,什么是否进行深拷贝,如何进行深拷贝
  30. go channel实现排序
  31. go中什么时候使用接口
  32. go的泛型
  33. 结构体传递场景
  34. 服务不重启热部署
  35. golang map两次循环打印的结果是否相同,使用注意事项,多线程访问
  36. 内存泄漏检测,并进行相关的实践

现场分析

rpc

其他

nginx

kafka与其他消息队列

k8s

毕竟项目中有很多k8s相关的知识,很多地方的go团队也都是做基础平台或者中间件这些。如果能在这些方面提出自己的见解,应该是比较大的加分项:

linux操作

wtysos11 commented 3 years ago

0713字节跳动go后台一面总结

因为一直在做腾讯的需求,基本是裸考,没能挖出什么东西 算法题真的要多刷刷Orz,哪怕是已经十二点睡觉七点起床也还是不能放弃刷算法题,不然就会想一道题都做不出来的我一样跟面试官尬聊到天明。

总结了一下,主要是三大点:

  1. go与基础。包括golang的协程、map、内存泄漏分析,但是相对来说比较简单。可能会有并发,但是没问。计算机网络问的比较多,包括HTTPS、三次握手的细节(哪一次能带数据)、
  2. 分布式系统。包括消息队列、redis,以及共识算法。消息队列、redis和数据库问的比较多的都是从原理出发,以及从对比出发(比如为什么用这个产品,有什么优点)。其中我所遇到的面试官倾向于让我自由发挥,这个就相当考验深度了。这个我感觉面试官相当有兴趣,不知道是不是个人原因。
  3. 算法题。主要就是这一点没搞出来……太久没刷题了,边界条件判断不太明确,手生。 反倒是项目问的不多,特别是简历上写的学校的项目一个都没提到,实习项目提到了一些。

之后的准备包含三个部分:

  1. 重点准备一下第二部分,现在很多地方感觉都会用到第二部分,一个是基础原理,一个是选型对比,这两个要好好思考一下。
  2. 算法题,多刷题,多练练手,每天整一道题就够了。
wtysos11 commented 3 years ago

0719字节二面总结

感觉挺不好的,最近休息的不太好,整个人都是懵的,第一道算法题连题目都看错了。 总体来说问的与一面没什么区别,但是很多地方可能思考的不太深刻,或者回答的不太正确,被回问了几下就不太确定了。除了要知道基本概念之外还是要知道更进一步的原因。 有几个地方我之前没怎么想到,一个是InnoDB的索引,我是第一次知道InnoDB的哈希索引是自适应的……这个不用过确实是不知道;此外还有依赖反转。以及一些很底层的东西,比如内核态和用户态具体是什么,系统调用的原理这些,虽然说很基础,但是真问的话其实不一定能答出来。 主要还是多刷些算法题,然后好好休息……

居然过了二面,真是让人摸不着头脑,只能说其他人表现更差一些吧。 后面的复习要点:

  1. 多看一些基础算法的思路,比如我这次二面被问了一道一百亿个数字排重,想一些思路。
  2. 除了是什么之外还要多了解一些为什么,并进行对比。特别是Mysql中InnoDB和MyIsam,消息队列中pulsar与kafka、rabbitMQ,C++与golang。
  3. 基础知识要抓牢,比如golang的协程,为什么调度代价更小,线程中究竟有什么,进程中有什么;比如中断;比如死锁;比如用户态和内核态;比如CPU缓存;比如内存调度策略;比如页面调度策略;比如计算机网络的一些细节知识,比如TCP连接的基础概念、拥塞避免和流量控制,TCP如何实现可靠性传输,为什么UDP不行,有什么改进TCP的方法。
  4. 进阶,比如Kubernetes的架构,docker的实现原理,redis的优点,消息队列等。
wtysos11 commented 3 years ago

0820 WXG面委准备