小厂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中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Golang中map缩容的实现

《Golang中map缩容的实现》本文主要介绍了Go语言中map的扩缩容机制,包括grow和hashGrow方法的处理,具有一定的参考价值,感兴趣的可以了解一下... 目录基本分析带来的隐患为什么不支持缩容基本分析在 Go 底层源码 src/runtime/map.go 中,扩缩容的处理方法是 grow

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe