暑假实习面试总结——Go语言|Golang

简介: 目录前景一面HR二面技术面终面总结

目录

前景

一面HR

二面技术面

终面

总结

前景

学Go语言也有大半年了,就想着大二暑期找个实习

面试了一家学校附近的公司,记录一下我的第一次面试过程


一面HR

自我介绍。

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

以上就是我的自我介绍。


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

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


平时如何学习Go语言。

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


进程和线程区别

进程是由多个线程组成的。

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


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

我只是到了HTTPS的S就是SSL,但是我对这方面的不太了解。

下面是整理后的答案

服务器认证阶段:

1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;

2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;

3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;

4)服务器回复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。

用户认证阶段:

1)在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。

2)经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。

SSL协议提供的安全通道有以下三个特性:

机密性:SSL协议使用密钥加密通信数据。

可靠性:服务器和客户都会被认证,客户的认证是可选的。

完整性:SSL协议会对传送的数据进行完整性检查。


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

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


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

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


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;
}

刚刚你提到了计算机组成原理,讲讲你计算机组成原理的学到了什么

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


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

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


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

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


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

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


讲讲go的反射

go的反射,我只在书上看到过,但是项目中,我并没有用过反射。我只是知道反射是能反射出输入数据的数据类型。

下面是整理

反射就是能检查程序在运行时的状态

reflect.ValueOf(h),得到实际的值,并且可以改变其字段值;

reflect.TypeOf(h),得到类型的元数据,通过t我们能获取类型定义里面的所有元素;

如果需修改value,该struct类型的字段必须是大写,小写相当于private,是不能通过反射修改的,会报异常.


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

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


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

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


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

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


你有什么想问我的吗

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


面试官的回答


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


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


2021年5月31日更新


终面

自我介绍

和上面一样


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

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


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

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


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

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


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

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


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

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


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


总结

我是班级的团支书,我以为会有一个问题是关于团支书的,没想到全是技术的问题,并没有涉及到这一职务,反而问了比较偏于技术的学院部门的事情。

linux系统要认真学一些深入的东西了,只知道一些基础的操作。也是面试官建议的。

关于算法部分,并没有问二叉树、排序、动态规划等的一些算法(还好没有当场写代码),打算继续刷力扣题了。

计算机网络,计算机组成原理,计算机操作系统倒是涉及到了部分,但是由于细节部分不太了解,所以就比较笼统。

数据库方面也只是问了锁的问题,没有进一步mysql、redis等进行询问。


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
24天前
|
Java 编译器 Go
【Golang】(1)Go的运行流程步骤与包的概念
初次上手Go语言!先来了解它的运行流程吧! 在Go中对包的概念又有怎样不同的见解呢?
71 4
|
24天前
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
94 3
|
24天前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
77 1
|
4月前
|
人工智能 测试技术 持续交付
Golang深入浅出之-Go语言中的持续集成与持续部署(CI/CD)
持续集成与持续部署(CI/CD)是现代软件开发的关键实践,尤其适用于Go语言项目。本文探讨了Go项目中常见的CI/CD问题,如测试覆盖不足、版本不一致和构建时间过长,并提供解决方案及GitHub Actions示例代码,帮助开发者优化流程,提升交付效率和质量。
121 5
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
543 4
Golang语言之管道channel快速入门篇
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
215 4
Golang语言文件操作快速入门篇
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
466 3
Golang语言之gRPC程序设计示例
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
268 4
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
593 4
Golang语言goroutine协程篇
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
240 3
Golang语言之Prometheus的日志模块使用案例

推荐镜像

更多