学Go语言也有大半年了,就想着大二暑期找个实习
面试了一家学校附近的公司,记录一下我的第一次面试过程
我是xxx,来自xxxxxx的一名大二学子,担任班级xxxx,协助班长和辅导员xxxxxxx,同时担任学院xxxx部门,完成xxxx任务。
以上就是我的自我介绍。
最深刻的是一个gin+vue的商场项目,go是去年9月学的,这个项目我从12月底写了2月头,写了两个月,从后端到前端,学习到了很多关于gin框架、gorm、vue等的一些知识。也累计到了很多经验,比如说支付功能,之前是没有写过了,通过这次的商城项目也学习到了。
平时的话就是在B站上面看教学视频,然后自己看书,和同学一起参加一些软件程序设计的比赛巩固之类的。
团队的交流吧,如果团队缺少交流的话,会导致很多问题。例如这个页面我是这样想的,然后和产品那边想的不一样,缺乏必要的交流导致大家都以为是自己的想的那样。最后结果就不符合要求。
我们部门分成四个部分offer小组、PS小组、视频组、科技小组。offer小组主要是帮助学院完成日常文档任务、年终PPT的制作,PS小组主要是做一些宣传海报,视频组是做一些宣传视频,科技小组主要是帮学院完成一些网页、小程序的制作,以及我们部门网站服务器的开发维护工作。
我所了解的是你们公司是做安全的,请问一下是做哪方面的安全?
一面HR的问题大概就是这些,问了一些近况以及学校的表现,学业压力等情况。
最后HR说三个工作日之类,会有通知结果。
同上
对,我是视频组的组长,帮助学院做过一个开学新生视频,还有数学建模的对外宣传视频。
这里就是建立了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收到确认后也进入了连接状态。
这部分面试的时候答的比较笼统,一些细节没说上来,就整理了一下。
首先IP地址其实时虚拟的地址,为了管理的方便。IP地址会通过ARP协议映射到链路层中的物理地址。以MAC帧的形式在链路层传送。IP地址在网络层的传输的话,就是通过子网掩码的与运算查看目的地址是否在局域网中,如果不在则通过路由器进行传输,在由路由器对网络进行与运算,直到找到目的地址。
进程是由多个线程组成的。
这两者根本区别是:线程是处理器分配调度的基本单位,进程是其他资源(除了处理器之外)分配的基本单位。另外进程的地址空间是私有的,处理器在进程之间切换时现场的保护/恢复的开销比较大,而同一进程的线程在处理器之内的切换时线程的保护/恢复的开销比较小。
我只是到了HTTPS的S就是SSL,但是我对这方面的不太了解。
下面是整理后的答案
服务器认证阶段:
1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;
2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;
3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;
4)服务器回复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。
用户认证阶段:
1)在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。
2)经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。
SSL协议提供的安全通道有以下三个特性:
机密性:SSL协议使用密钥加密通信数据。
可靠性:服务器和客户都会被认证,客户的认证是可选的。
完整性:SSL协议会对传送的数据进行完整性检查。
那就是在进程中加锁,看需求,如果写比读多就加互斥锁锁,如果读比写多就加读写互斥锁,最后再defer这个锁。
go进程的等待是阻塞的,也就是说当我go一个进程之后,用sync.WaitGroup进行进程的管理,进程增加就是Add(),进程在执行就用Wait()对其进行阻塞等待。然后再用Done()完成。这样能对进程之间进行安全的管理。
我不知道了,在计算机组成原理上面学的,计算机底层只有加法器。嗯嗯嗯,应该可以吧…
下面正解
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;
}
这门课大一学的,已经一年了,学到了一些计算机底层的东西,比如底层是只有加法器,其他运算都是通过加法器改来的,还有一些数值的范围,补码移码运算,还有一个cache的概念,和一些MOV,LAD,ADD等一些指令等等。
go切片的底层其实就是数组,数组是不可边的,切片是可变的。
我的话就用append进行删除,把这一个值的下标的前一个和后一个继续append拼接,就把中间的与这个删掉了。
如果我不清楚go的map有没有特定函数进行排序的话,我会用两个切片对这个map的key进行存储,然后进行排序,在让map中的value按照切片中map进行输出。
go的反射,我只在书上看到过,但是项目中,我并没有用过反射。我只是知道反射是能反射出输入数据的数据类型。
下面是整理
反射就是能检查程序在运行时的状态
reflect.ValueOf(h),得到实际的值,并且可以改变其字段值;
reflect.TypeOf(h),得到类型的元数据,通过t我们能获取类型定义里面的所有元素;
如果需修改value,该struct类型的字段必须是大写,小写相当于private,是不能通过反射修改的,会报异常.
我的话是专门写一个序列化的一个函数,每个返回都进行一次序列化操作,就是一个接口定义专门的序列化函数,进行数据的返回。
错误码统一放置。一个项目,三分靠开发,七分靠维护。不过如果是200个的话,我觉得应该是有很多接口是可以重复利用序列化的函数的,这个我觉得可能就要看数据库的架构是怎么样的了,200个接口,如果是数据的架构问题,那我是改不了了,但如果不是数据库的架构问题,那我觉得应该是有很多重复的,可能错误码就占到一般,所以就错误码统一放置。
go有着python的简洁,也能通过指针操作内存,所以有类似C++的性能(担任肯定是比不上C++的),也不想java那么难部署,背后有Google公司。而且现在云计算,分布式大火,这些也是go的主场,所以我选择了go。
你们公司有那些业务用到go吗?
面试官的回答
我们公司是用java的架构,现在是有一个很大的主节点,但是要有一些小的节点操作,如果用java的话就比较难部署,所以这部分小节点的业务我们就打算用易于部署的go进行,go的部署很容易。
大概是这些问题,有些我记不太清楚了。最后面试官说等三个工作日。
2021年5月31日更新
和上面一样
因为我是班级团支书,也担任学院学生会部门的副部,平时学业以外还有其他的学生工作,我觉得之前能平衡好学习和学生工作,这个也可以的。
这个学期还好,上个学期就有点失衡,所以上学期的绩点就有点低,那我是水课的话就用来做作业或是做学生工作,专业课认真听讲,当天作业就当天完成,绝对不能拖。必须提高效率,大概就是这样。
我最大的变化我觉得是,服从上级吧,以前我是有什么自己的想法就提,但是总是被反驳回来,后来我觉得就算了,上级这样安排,也有上级的道理,我觉得在公司也是一样的道理,上级安排了什么任务,什么事情,也是有一定的道理的。
我觉得我应该还会的,我还年轻,正值热血青年,可能态度就不想当初那么坚硬了,我提出我的想法,上级或是他人接不接收就看他们自己了。
首先,如果是一开始进入公司,我和leader的想法还没融合的话,我觉得我应该会想让leader 把任务列出来,step by step,因为我不知道leader是否是我所想的那样的,等后面和leader磨合了之后,我可能就已经知道leader想要什么效果,就不需要leader把任务列出来了。我的想法就是这样。
具体还有一些无关紧要的就没打出来。也不是技术层面的,基本都是合作层面。
联系客服