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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 目录前景一面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等进行询问。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
缓存 前端开发 中间件
[go 面试] 前端请求到后端API的中间件流程解析
[go 面试] 前端请求到后端API的中间件流程解析
|
2月前
|
算法 Go
[go 面试] 雪花算法与分布式ID生成
[go 面试] 雪花算法与分布式ID生成
|
26天前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
45 10
|
1月前
|
Go
golang语言之go常用命令
这篇文章列出了常用的Go语言命令,如`go run`、`go install`、`go build`、`go help`、`go get`、`go mod`、`go test`、`go tool`、`go vet`、`go fmt`、`go doc`、`go version`和`go env`,以及它们的基本用法和功能。
29 6
|
1月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
33 3
|
2月前
|
存储 负载均衡 算法
[go 面试] 一致性哈希:数据分片与负载均衡的黄金法则
[go 面试] 一致性哈希:数据分片与负载均衡的黄金法则
|
2月前
|
运维 监控 容灾
[go 面试] 实现服务高可用的策略和实践
[go 面试] 实现服务高可用的策略和实践
|
2月前
|
Go API 数据库
[go 面试] 分布式事务框架选择与实践
[go 面试] 分布式事务框架选择与实践
|
2月前
|
安全 Go 调度
[go 面试] 深入理解并发控制:掌握锁的精髓
[go 面试] 深入理解并发控制:掌握锁的精髓
|
2月前
|
Go 开发者
下一篇
无影云桌面