前景

学Go语言也有大半年了,就想着大二暑期找个实习
面试了一家学校附近的公司,记录一下我的第一次面试过程

一面HR

  1. 自我介绍。

我是xxx,来自xxxxxx的一名大二学子,担任班级xxxx,协助班长和辅导员xxxxxxx,同时担任学院xxxx部门,完成xxxx任务。
以上就是我的自我介绍。

  1. 简单聊聊简历上的项目,哪个项目你的印象是最深刻的或是学习到比较多的。

最深刻的是一个gin+vue的商场项目,go是去年9月学的,这个项目我从12月底写了2月头,写了两个月,从后端到前端,学习到了很多关于gin框架、gorm、vue等的一些知识。也累计到了很多经验,比如说支付功能,之前是没有写过了,通过这次的商城项目也学习到了。

  1. 平时如何学习Go语言。

平时的话就是在B站上面看教学视频,然后自己看书,和同学一起参加一些软件程序设计的比赛巩固之类的。

  1. 开发过程中遇到最大的问题是什么。

团队的交流吧,如果团队缺少交流的话,会导致很多问题。例如这个页面我是这样想的,然后和产品那边想的不一样,缺乏必要的交流导致大家都以为是自己的想的那样。最后结果就不符合要求。

  1. 你能讲讲你所在的部门吗。

我们部门分成四个部分offer小组、PS小组、视频组、科技小组。offer小组主要是帮助学院完成日常文档任务、年终PPT的制作,PS小组主要是做一些宣传海报,视频组是做一些宣传视频,科技小组主要是帮学院完成一些网页、小程序的制作,以及我们部门网站服务器的开发维护工作。

  1. 你对我们公司有什么想问的吗。

我所了解的是你们公司是做安全的,请问一下是做哪方面的安全?

一面HR的问题大概就是这些,问了一些近况以及学校的表现,学业压力等情况。
最后HR说三个工作日之类,会有通知结果。


二面技术面

  1. 自我介绍

同上

  1. 你是你们部门视频组的,有做过什么宣传视频吗

对,我是视频组的组长,帮助学院做过一个开学新生视频,还有数学建模的对外宣传视频。

  1. 我从浏览器输入了一个数据,获得数据,这一部分主要有哪些动作

这里就是建立了TCP连接,将我输入的数据通过HTTP请求发给后端服务器,在这里就是要进行一个TCP连接的建立。
假设主机A是TCP客户程序,B是TCP服务器程序。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端被打开链接。一开始B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的链接请求,然后服务器进程就处于LISTEN收听状态,等待A的连接请求。
然后A的进程首先创建传输控制模块TCB。向B发出连接请求报文段,这是首部当中的同步位SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN报文段(即SYN=1的报文段)不能写数据,但要消耗掉一个序号。这时候A就进入了同步已发送的状态。
B收到连接请求报文段后,如果同意建立连接,则向A发送确认,在确认报文段中把SYN位和AVK位置都置为1,确认号为ack+1,同时也为自己选择一个初始序号y。同样的这个报文段也是不能写数据的,但同时要消耗掉一个序号。这时B进入了同步收到状态。
A收到B的确认之后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的seq=x+1。ACK报文段是可以携带数据的,但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍为seq=x+1。 这时候TCP已经建立了。A进行入了已经建立连接的阶段状态。B收到确认后也进入了连接状态。

这部分面试的时候答的比较笼统,一些细节没说上来,就整理了一下。

  1. IP地址如何找到目标地址

首先IP地址其实时虚拟的地址,为了管理的方便。IP地址会通过ARP协议映射到链路层中的物理地址。以MAC帧的形式在链路层传送。IP地址在网络层的传输的话,就是通过子网掩码的与运算查看目的地址是否在局域网中,如果不在则通过路由器进行传输,在由路由器对网络进行与运算,直到找到目的地址。

  1. 进程和线程区别

进程是由多个线程组成的。
这两者根本区别是:线程是处理器分配调度的基本单位,进程是其他资源(除了处理器之外)分配的基本单位。另外进程的地址空间是私有的,处理器在进程之间切换时现场的保护/恢复的开销比较大,而同一进程的线程在处理器之内的切换时线程的保护/恢复的开销比较小。

  1. 谈谈你对SSL证书的理解(这个根本答不上来)

我只是到了HTTPS的S就是SSL,但是我对这方面的不太了解。
下面是整理后的答案
服务器认证阶段:
1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;
2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;
3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;
4)服务器回复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。
用户认证阶段:
1)在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。
2)经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。
SSL协议提供的安全通道有以下三个特性:
机密性:SSL协议使用密钥加密通信数据。
可靠性:服务器和客户都会被认证,客户的认证是可选的。
完整性:SSL协议会对传送的数据进行完整性检查。

  1. 如果我两个进程要对一个数据进行读写,如何避免竞争,防止数据的读出的不正确

那就是在进程中加锁,看需求,如果写比读多就加互斥锁锁,如果读比写多就加读写互斥锁,最后再defer这个锁。

  1. go里面的同步和异步中,go进程是如何完成等待的和执行的。

go进程的等待是阻塞的,也就是说当我go一个进程之后,用sync.WaitGroup进行进程的管理,进程增加就是Add(),进程在执行就用Wait()对其进行阻塞等待。然后再用Done()完成。这样能对进程之间进行安全的管理。

  1. uint能相减吗
    这个当时答了可以,后来面试官提示了一下,就犹豫了,就说不知道了。

我不知道了,在计算机组成原理上面学的,计算机底层只有加法器。嗯嗯嗯,应该可以吧…
下面正解
uint的范围是在2^31 - 1,即:0~4294967295,所以如果是发生越界的话,只能是这个数4294967295。所以是看情况是否能相减,如果相见的数字是在范围内的就可以了,如果超出范围是不行的。

附上例子

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    int a = 20;
    unsigned int n = 3;
    unsigned int b = 6;
    cout<<a-b<<endl; //14
    cout<<b-n<<endl; //3
    cout<<n-b<<endl; //4294967293
    cout<<4+n-b<<endl;//1
    return 0;
}
  1. 刚刚你提到了计算机组成原理,讲讲你计算机组成原理的学到了什么

这门课大一学的,已经一年了,学到了一些计算机底层的东西,比如底层是只有加法器,其他运算都是通过加法器改来的,还有一些数值的范围,补码移码运算,还有一个cache的概念,和一些MOV,LAD,ADD等一些指令等等。

  1. 讲讲go的数组和切片的区别

go切片的底层其实就是数组,数组是不可边的,切片是可变的。

  1. 如果我要删除数组切片中特定的值具体如何做

我的话就用append进行删除,把这一个值的下标的前一个和后一个继续append拼接,就把中间的与这个删掉了。

  1. 如何对map键值对中的数据按照key进行排序

如果我不清楚go的map有没有特定函数进行排序的话,我会用两个切片对这个map的key进行存储,然后进行排序,在让map中的value按照切片中map进行输出。

  1. 讲讲go的反射

go的反射,我只在书上看到过,但是项目中,我并没有用过反射。我只是知道反射是能反射出输入数据的数据类型。
下面是整理
反射就是能检查程序在运行时的状态
reflect.ValueOf(h),得到实际的值,并且可以改变其字段值;
reflect.TypeOf(h),得到类型的元数据,通过t我们能获取类型定义里面的所有元素;
如果需修改value,该struct类型的字段必须是大写,小写相当于private,是不能通过反射修改的,会报异常.

  1. 你能讲一下你是如何定义接口返回类型的

我的话是专门写一个序列化的一个函数,每个返回都进行一次序列化操作,就是一个接口定义专门的序列化函数,进行数据的返回。

  1. 如果我有200个接口,你是如何解决这个问题,保证高效开发呢

错误码统一放置。一个项目,三分靠开发,七分靠维护。不过如果是200个的话,我觉得应该是有很多接口是可以重复利用序列化的函数的,这个我觉得可能就要看数据库的架构是怎么样的了,200个接口,如果是数据的架构问题,那我是改不了了,但如果不是数据库的架构问题,那我觉得应该是有很多重复的,可能错误码就占到一般,所以就错误码统一放置。

  1. 你对Linux系统了解不深的话,就不问你Linux了,为什么会选择go呢

go有着python的简洁,也能通过指针操作内存,所以有类似C++的性能(担任肯定是比不上C++的),也不想java那么难部署,背后有Google公司。而且现在云计算,分布式大火,这些也是go的主场,所以我选择了go。

  1. 你有什么想问我的吗

你们公司有那些业务用到go吗?

面试官的回答

我们公司是用java的架构,现在是有一个很大的主节点,但是要有一些小的节点操作,如果用java的话就比较难部署,所以这部分小节点的业务我们就打算用易于部署的go进行,go的部署很容易。

大概是这些问题,有些我记不太清楚了。最后面试官说等三个工作日。

2021年5月31日更新


终面

  1. 自我介绍

和上面一样

  1. 我不是技术出身的,我是想说你来实习工作是和在学校不一样的,这里工作节奏很快,工作压力也可能很大,你是第一次实习,你能给我一个理由说说你为什么能胜任这个岗位吗?

因为我是班级团支书,也担任学院学生会部门的副部,平时学业以外还有其他的学生工作,我觉得之前能平衡好学习和学生工作,这个也可以的。

  1. 那你是怎么平衡你的学习和学生工作呢?

这个学期还好,上个学期就有点失衡,所以上学期的绩点就有点低,那我是水课的话就用来做作业或是做学生工作,专业课认真听讲,当天作业就当天完成,绝对不能拖。必须提高效率,大概就是这样。

  1. 那你做学生工作,你有什么改变吗?

我最大的变化我觉得是,服从上级吧,以前我是有什么自己的想法就提,但是总是被反驳回来,后来我觉得就算了,上级这样安排,也有上级的道理,我觉得在公司也是一样的道理,上级安排了什么任务,什么事情,也是有一定的道理的。

  1. 那你觉得现在的你,回去了还会提意见吗?

我觉得我应该还会的,我还年轻,正值热血青年,可能态度就不想当初那么坚硬了,我提出我的想法,上级或是他人接不接收就看他们自己了。

  1. 那我问一个问题,如果你的leader给你一个任务,你是想要leader把任务列出来,step by step,一步步让你这样做,还是想你自己去做?

首先,如果是一开始进入公司,我和leader的想法还没融合的话,我觉得我应该会想让leader 把任务列出来,step by step,因为我不知道leader是否是我所想的那样的,等后面和leader磨合了之后,我可能就已经知道leader想要什么效果,就不需要leader把任务列出来了。我的想法就是这样。

具体还有一些无关紧要的就没打出来。也不是技术层面的,基本都是合作层面。

总结

  1. 我是班级的团支书,我以为会有一个问题是关于团支书的,没想到全是技术的问题,并没有涉及到这一职务,反而问了比较偏于技术的学院部门的事情。
  2. linux系统要认真学一些深入的东西了,只知道一些基础的操作。也是面试官建议的。
  3. 关于算法部分,并没有问二叉树、排序、动态规划等的一些算法(还好没有当场写代码),打算继续刷力扣题了。
  4. 计算机网络,计算机组成原理,计算机操作系统倒是涉及到了部分,但是由于细节部分不太了解,所以就比较笼统。
  5. 数据库方面也只是问了锁的问题,没有进一步mysql、redis等进行询问。
Logo

前往低代码交流专区

更多推荐