小厂golang实习一面凉经

2023-10-12 06:50

本文主要是介绍小厂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实习一面凉经的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/194090

相关文章

Golang进程权限调度包runtime

关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行GOMAXPROCS:设置最大的可同时使用的 CPU 核数Goexit:退出当前 goroutine(但是defer语句会照常执行)NumGoroutine:返回正在执行和排队的任务总数GOOS:目标操作系统NumCPU:返回当前系统的 CPU 核数量 p

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使

Golang网络爬虫框架gocolly/colly(四)

爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟。回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫,那时由于项目需要,要访问各大国际社交网站,Facebook,myspace,filcker,youtube等等,国际上叫得上名字的社交网站都爬过,大部分网站提供restful api,有些功能没有api,就只能用http抓包工具分析协议,自己爬;国内的优酷、

Golang网络爬虫框架gocolly/colly(三)

熟悉了《Golang 网络爬虫框架gocolly/colly 一》和《Golang 网络爬虫框架gocolly/colly 二》之后就可以在网络上爬取大部分数据了。本文接下来将爬取中证指数有限公司提供的行业市盈率。(http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio) 定义数据结构体: type Zhj

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

Golang服务平滑重启

与重载配置相同的是我们也需要通过信号来通知server重启,但关键在于平滑重启,如果只是简单的重启,只需要kill掉,然后再拉起即可。平滑重启意味着server升级的时候可以不用停止业务。 我们先来看下Github上有没有相应的库解决这个问题,然后找到了如下三个库: facebookgo/grace - Graceful restart & zero downtime deploy for G

Golang test编译使用

创建文件my_test.go package testsimport "testing"func TestMy(t *testing.T) {t.Log("TestMy")} 通常用法: $ go test -v -run TestMy my_test.go=== RUN TestMyTestMy: my_test.go:6: TestMy--- PASS: TestMy (0.

Golang GUI入门——andlabs ui

官方不提供gui标准库,只好寻求第三方库。 https://github.com/google/gxui 这个gui库是谷歌内部人员提供的,并不是谷歌官方出品,现在停止维护,只好作罢。 第三方gui库 找了好多,也比较了好多,最终决定使用的是还是 https://github.com/andlabs/ui 相信golang gui还会发展的更好,期待更优秀的gui库 由于andlabs

实习项目|苍穹外卖|day7

缓存菜品 1.根据原型进行需求分析与设计(接口文档) 2.根据接口设计DTO(redis数据类型选取) 3.编码controller-》service-》mapper @GetMapping("/list")@ApiOperation("根据分类id查询菜品")public Result<List<DishVO>> list(Long categoryId) {//判断缓存

CVTE java web后台实习生笔试+技术一面总结

投的第一份简历,也可以说是第一次写笔试和参加面试。题在前面,总结在最后,努力不骗人。 笔试 题型:20道不定项选择题+2道算法题+1道架构设计题 选择题 选择题出的很全面,因为是不定项选择,一道题就可以考很多知识点。 当时做的时候以为笔试都是这么难,做完实验室同学告诉我这个算比较难的了,而且据我观察可能是跟春招找正式offer的一批难度的题。可能最后过的标准不一样吧。 选项信息量很大,