本文主要是介绍小厂golang实习一面凉经,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
学的主要是java,然而Boss直聘海投没细看投了go后端,结果简历居然过了筛。整体面下来感觉还是很不错的,面试官态度很好,只是这次准备实在不充分,很多东西答不上来,凉的很透。不过第一次线下面还算是收获颇丰,所以整理总结一下。
目录
1.自我介绍
2.看你简历里客户端后端前端都做过,为什么选择后端?
3.项目中的难点,怎么解决的
4.说说Jwt吧,它的原理
5.看到你项目里用的是MySQL对吧,你了解MySQL索引么?它用了什么数据结构?
6.为什么要用B+树做索引?它有哪些优点?怎么不用二叉树?
7.B+树在B树上做的改进?
8.对mysql的索引调优你有什么了解?
9.你的项目中用Redis做了什么?
10.Redis索引的机制?
11.讲一下乐观锁
12.http的状态码
13.说说工厂模式
反问环节
1.自我介绍
2.看你简历里客户端后端前端都做过,为什么选择后端?
(回答大概是后端比较符合个人兴趣,前端太杂了,面试官表示前端还在发展中,目前机会可能比较多,后端发展较早水可能比较深,但是成规模,总之各有利弊。)
3.项目中的难点,怎么解决的
由于需要处理用户权限问题而使用了SpringSecurity框架,其中考虑到安全性而使用了Jwt进行加密处理,但是Security本身有一个BCrypt密码加密的格式问题,所以查了一些博客和谷歌来解决了该问题。
4.说说Jwt吧,它的原理
(这里答得乱七八糟)
用户登录后,前端给后端提供一个表单信息,后端将Json字符加密并签发一个token给前端让其储存。前端储存后每次请求信息时都带上该token给后端,用于验证权限,后端验证成功后再将数据返回。
面试官:你说的这是用户权限处理吧,那这个传递过程中如何保证token信息没有被前端篡改呢?
(短路中,一下想不起来相关信息。)
面试官:那除了Jwt以外你还了解哪些认证方式呢?
还了解一个传统的认证方法,大概是把用户信息放在浏览器的cookie里,但是这样做的弊端是如果使用的不是浏览器而是客户端,因为没有cookie就没有办法移植了。而且也不安全。
面试官:你说的是session吧,为什么不安全呢?
(流汗中)因为信息存在cookie里……吧,是明文么?
面试官:
它不是明文,其实它是安全的,是加密过的一串码,最不安全的是Jwt。
之前的这个方式需要一个表,存储加密后的数据对应的用户信息,这就导致了性能上的浪费,而且如果这个表出了问题,整个业务就无法继续运行,因此有了Jwt。
Jwt一般是分三段,标头(Header)、有效载荷(Payload)和签名(Signature)。服务端提供一个签名来保证token不被篡改,如果修改了token就会验证失败。
现在做验证用的基本上用的都是Jwt,当然一些大公司有别的技术就是另外一回事了。
(找了个 博客详细了解了一下)
header和payload可以直接利用base64解码出原文,从header中获取哈希签名的算法,从payload中获取有效数据。 signature由于使用了不可逆的加密算法,无法解码出原文,它的作用是校验token有没有被篡改。服务端获取header中的加密算法之后,利用该算法加上secretKey对header、payload进行加密,比对加密后的数据和客户端发送过来的是否一致。注意secretKey只能保存在服务端,而且对于不同的加密算法其含义有所不同,一般对于MD5类型的摘要加密算法,secretKey实际上代表的是盐值。
5.看到你项目里用的是MySQL对吧,你了解MySQL索引么?它用了什么数据结构?
了解一些,用的是b+树。
6.为什么要用B+树做索引?它有哪些优点?怎么不用二叉树?
(胡诌)B+树节点可以有多个元素,是一对多的关系所以比较适合做索引吧。二叉树容易不平衡然后成为斜树……
面试官:那平衡的呢
平衡的,平衡的就没有顺序了吧。好像这部分数据结构是为了解决某些问题发展的,先二叉树再红黑树再b树再b+树。
面试官:嗯,确实是。那平衡也有顺序的二叉树,为啥不用呢?
(不知道)
面试官:这个还得从早期的磁盘说起,磁盘主要的限制是什么?(分块读取?)不对,是随机寻址效率很低,寻一个地址大概需要多少多少毫秒。二叉树层数太高了,寻址次数就会相应增加,那就太慢了,因此引入了B树。
7.B+树在B树上做的改进?
B+树在节点的数据存储上做了改变吧,B+树的节点只存储索引key值,具体信息的地址存在于叶子节点的地址中。
面试官:是的,那有什么好处呢?
我猜是IO读写降低了?(开摆)
面试官:这样它就把所有信息都放在了叶子节点里,然后就可以成块查询。(这里我真没太听明白)还做了其他改进么?
我:不清楚了。
面试官:B+树中叶子和叶子节点间增加了一个双向的链表,这样查找就不用再返回到根节点了。更有便于范围查询。
8.对mysql的索引调优你有什么了解?
不了解。
9.你的项目中用Redis做了什么?
用户登录时将信息存入redis,收到token后解析出id,在redis里通过用户id查找用户信息,如果没有该id则未登录,登出时从库里删除该id。
面试官:为什么要用redis呢,和mysql的区别在哪?
答:处理一下高并发吧,因为是暂时性的信息,频繁存取,感觉用redis好一点。
(面试官表示没有问题,但对我的小项目来说意义不大,因为不存在高并发。)
10.Redis索引的机制?
不了解。
11.讲一下乐观锁
(脑子短路巴拉巴拉一顿讲,结果讲成了悲观锁。)
面试官:这很基础,你回去查。
回来重新查了下,感觉简单来说就是悲观锁在用共享资源时就给锁上,后面的人想用得等前面的人开锁。乐观锁就是用且信任这资源没问题,只是会检查一下资源是否被改动,改动了就重新读。
12.http的状态码
200 500 402 404 只了解这几个
面试官:按段来吧,每段都分别是什么错误
没有归纳过。大概凭经验答了一下200是成功,400段是用户权限出问题或者请求信息出问题,500段是后端服务器bug。
回来找了一张图 ,300重定向这个真没见过。
13.说说工厂模式
感觉一下很难说,先问了一下什么工厂模式,抽象工厂么?然后简单的举了个生产各种牌子的电脑的例子。
面试官:工厂模式的好处在哪?
解耦,可以省去多余参数的考虑。
面试官:这种设计模式主要依赖面向对象语言的哪个特性呢?
好久没看java基础,加上紧张居然把三大特性都忘了……大脑一片空白,想半天只吭哧出一句封装。
面试官:其实主要依赖的是多态性,像电脑可以通过一个工厂产出多个牌子都属于多态。
反问环节
问了想要提高计算机水平有什么推荐的书籍,于是得到了一堆mysql的资料。面试官反复强调了几遍一定要找实习,说我们这一届很卷。语言方面面试官表示高级语言都只是抓手,主要看中的还是知识深度。总之感受到了自己知识储备的巨大缺口qwq
这篇关于小厂golang实习一面凉经的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!