Go常见八股整理与解析

******************

Go的八股不多,所以咱们偏向于求精不求多,尽量讲出深度和广度。

广度,代表了你的知识面、深度代表了你对该点有深入的理解。

广度,通常是通过横向对比体现的;深度,通常是细节去体现的

后面会具体举例说明如何表达出深度和广度。

面试准备

我个人的简历上面,写的是

熟悉Golang: Slice、Map、GPM调度器垃圾回收机制等

面试官基本的提问方式是,“我看你简历上有写xx,你给我介绍一下xx吧”

所以,你就需要准备好说辞,想好怎么涉及广度又涉及深度地表达。

首先大家要想好以怎么样子一个结构去表达,我个人的一般方式是

  • 背景:这个东西是干啥的,有什么作用
  • 核心原理:代表你的理解
  • 细节:细节是某些数据的设置,或者特定场景的优化。细节,就表达你的深度,同时也能够让面试官相信有你真实理解,而不只是背八股。
  • 总结拔高:这里通过就需要你对某些点有些深入的理解或者横向对比,这个是用来加分的,这也是和别人拉开差距的地方,表达你有不一样的理解。

Golang中的map的例子

我以golang中的map为例子,大家理解一下,注意,面试的时候尽量用口语话的表达,不然就像在背八股。口语中有“就是”、“然后”这样的衔接词。

map它的底层是哈希表,那哈希表通常我们需要考虑3个方面,哈希函数、冲突处理、扩容方式。

哈希函数这个没啥好说的,是尽量保证哈希结果稀疏就好。

冲突处理这块,golang中的map采用的是拉链法,不过这有个细节就是,这个map的链表的节点是一个桶,一个桶你可以理解为一个8个元素的数组,这样做的好处就是,减少了频繁分配链表节点时的开销,我理解的话,这是一种时间和空间上的折中

扩容方式这块,是采用渐进式扩容,渐进式扩容就可以把时间均摊到每次请求上,不会有那种常规扩容的卡顿的情况。然后前面提到桶,golang也提出等量扩容的方式,主要是在稀疏的情况下做,减少检索和内存的开销

单个点拉出来看

  • 背景:哈希表由于是人尽皆知的,所以可以不用介绍。
  • 核心原理:按照3个方面,哈希函数、冲突处理、扩容方式,去介绍。
  • 多个细节:拉链法、链表节点是桶、等量扩容
  • 总结拔高
    • 关于桶这点,“减少了频繁分配链表节点时的开销,这是一种时间和空间上的折中。”
    • 等量扩容,“主要是在稀疏的情况下做,减少检索和内存的开销。”

这样,是不是让面试官感觉你对map了解很透彻的同时,能做横线对比,体现了知识广的优势。

Golang的GPM调度器

再比如协程调度器GPM,可以从这么几个角度,按顺序吟唱

  • 背景:为什么要有GPM调度器
  • 核心数据结构:G、P、M
  • 调度逻辑:正常情况下、挂起和恢复情况下、负载均衡情况、抢占式调度
  • 横向对比:调度器可以和Linux的线程调度器CFS对比来看,有哪些异同,比如都有全局对立和本地队列、都有负载均衡机制、差异是golang的调度实现更简单

如下图

大家把这些内容填进去,按顺序说,就是流畅的八股表达

Go其他八股

其他的比如

  • slice
  • sync.Map
  • 垃圾回收
  • channel
  • new和make的区别

其他那种简单看看的八股我就不额外写了,大家看看就能会。上面这些我把图贴出来给大家参考。

GPM alt Slice alt sync.Mapalt 垃圾回收 alt map alt channel alt

完整文件

如果需要完整文件,由于牛客没法放xmind文件,也没法放百度网盘链接【恼】,可以看上面文章来源获取,后续也会放其他的八股,Redis、MySQL和分布式、微服务等等,欢迎关注我的牛客和公众号!

#八股##go##我发现了面试通关密码##背八股如何背出深度和广度#
全部评论
链接在哪里
3 回复 分享
发布于 2024-09-23 23:34 辽宁
链接在哪
点赞 回复 分享
发布于 04-17 18:26 安徽
求链接,没找到
点赞 回复 分享
发布于 2024-12-11 17:23 广东

相关推荐

投递中国电信等公司10个岗位
点赞 评论 收藏
分享
10-30 19:05
门头沟学院 C++
1、挑一个项目介绍一下2、实习项目中spdlog库的使用方法3、如何借助spdlog库,实现自己的sink4、sink是线程安全的吗,如何保证5、日志压缩如何实现的,说一下这个过程中的竞争问题6、日志压缩异步任务的资源竞争问题,什么情况下notify,谁负责notify7、如果通知线程先通知了,异步任务线程才开始wait,那么这个线程还能处理任务队列中的任务吗8、static_cast和reinterpret_cast有什么区别9、一个类的成员函数中有一个lamda表达式,可以访问这个类的私有成员吗,如何访问,如何传参10、lamda表达式可以拷贝吗11、如果一个lamda表达式有一个按值捕获的变量a,再拷贝了这个lamda表达式是什么结果12、threadlocal了解吗,作用是什么,什么时候创建呢13、如果一个线程创建了一个threadlocal变量a,它可以让另一个线程访问吗,如果硬要传可以吗14、什么场景下用list比vector好呢15、vector里有10个成员,迭代器指向第3个元素,现在删除第4个元素,那么这个迭代器会失效吗16、unordered_map也是有很多元素,如果插入一个元素,原本的迭代器会失效吗,什么情况下会失效17、移动语义move一般在什么情况下用18、什么场景下用move可以获得不错的性能增益,什么情况下不能19、一个结构体里有一个1000size的数组,一个实例在move之后,那这个数组发生什么变化20、原子操作和互斥锁一般用在什么场景21、如果我给三个变量赋值,那我用三个原子变量可以吗22、父进程open了一个文件描述符,fork了一个子进程,那子进程可以访问这个文件描述符吗23、如果子进程close了这个文件描述符,父进程还可以访问吗24、父进程读文件读到第10个字节,如何fork了一个子进程,子进程读的话,是从第几个字节开始读
查看24道真题和解析
点赞 评论 收藏
分享
10-22 16:26
已编辑
东北师范大学 Java
点赞 评论 收藏
分享
评论
52
313
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务