面试完第一反应是想笑

先来唠唠
组织内有位朋友最近刚经历了人生第一次面试,还是家大厂,面试完他自己都想笑。
他总觉得自己平时学的那些够应付了,结果一去面试就露了怯。面试官特别温和,问的问题也都扎实又专业,可他对着那些问题,好多都只能结结巴巴地卡着,半天说不完整句话。
之前总觉得自己学得还行,其实根本是自我感觉良好,跑过去面试还耽误了人家时间。
而且这样还会在大厂里面留下黑名单,后面还想约面就难了,所以在这里奉劝实习或者校招想要冲击大厂的同学,一定不要一开始就直接去大厂面试,先去其他的地方练练手。
下面也分享一下他整理的面经:
某大厂面经
1. go struct 可以比较吗
在 Go 语言中,struct 是否可以比较取决于其字段类型:
若 struct 的所有字段都是可比较类型(如 int、string、数组、指针等),则该 struct 可以比较,比较时会逐字段进行值对比;
若 struct 中包含不可比较类型的字段(如 slice、map、func 等),则该 struct 不可比较,编译时会报错。
2. slice 扩容机制(Go 1.18+ 版本)
Go 1.18 版本后,slice 的扩容规则发生了调整,更精确地控制内存分配,避免过度扩容。具体规则如下:
基础扩容逻辑:
当所需容量(newcap)小于等于原容量(oldcap)的 2 倍时:
若元素大小(elemsize)为 1、8 或 2 的幂次方,且 newcap 不超过 256,则扩容后的容量为原容量的 2 倍;
否则,使用公式
newcap += (newcap + 3*256) / 4
逐步调整,直到满足需求。当所需容量大于原容量的 2 倍时:
直接使用所需容量作为初始 newcap。
内存对齐优化:
扩容后的容量会根据元素类型的大小(elemsize)和内存对齐规则进行调整,确保分配的内存块是页大小的整数倍,提升内存访问效率。
示例说明:
若原 slice 容量为 100,新增 50 个元素(需容量 150 ≤ 200),则扩容后容量为 200(2 倍);
若原 slice 容量为 200,新增 200 个元素(需容量 400 > 400),则直接扩容为 400。
3. 带缓冲区 channel 关闭后的读写
带缓冲区的 channel 关闭后,读写行为不同:
读操作:若缓冲区还有数据,可正常读取数据(返回数据和 true);当缓冲区数据读完后,再次读取会返回该 channel 元素类型的零值和 false;
写操作:向已关闭的 channel 写入数据会直接触发 panic(Go 不允许向关闭的 channel 写数据)。
4. linux 怎么查看 cpu 占用
常用命令如下:
top
:实时动态查看进程 CPU 占用,按P
可按 CPU 使用率排序(默认显示总体 CPU 占用,按1
可查看单个核心占用);ps aux
:静态查看进程 CPU 占用(%cpu
列显示使用率),结合grep
可筛选特定进程;mpstat
:查看多核 CPU 的每个核心占用情况(需安装 sysstat 工具);vmstat
:查看系统整体 CPU 状态(包括用户态、系统态、空闲等占比)。
5. 软链接和硬链接区别
主要区别体现在存储、依赖关系等方面:
存储方式:硬链接是原文件 inode 的“别名”(与原文件共享同一个 inode);软链接是独立文件,存储的是原文件的路径(有自己的 inode);
跨文件系统:硬链接不能跨文件系统(因 inode 仅在单个文件系统内唯一);软链接可以跨文件系统;
原文件删除影响:删除原文件后,硬链接仍可访问(因 inode 未被释放);软链接会失效(变成“断链”);
支持对象:硬链接不支持目录(避免循环引用);软链接支持目录。
6. 什么是死锁
死锁是指多个进程(或线程、协程)互相等待对方释放资源,导致所有进程都无法继续执行的状态。
死锁产生需满足四个必要条件:互斥(资源只能被一个进程占用)、持有并等待(进程持有部分资源,同时等待其他资源)、不可剥夺(资源不能被强制抢占)、循环等待(进程间形成互相等待资源的闭环)。
7. HTTP/1.1 和 HTTP/2.0 区别
核心区别如下:
协议格式:HTTP/1.1 是文本协议(可读性强,但解析效率低);HTTP/2 是二进制协议(分帧传输,解析快,更紧凑);
多路复用:HTTP/1.1 同一域名下默认允许 6-8 个并发连接(存在“队头阻塞”问题);HTTP/2 通过“帧”和“流”实现单连接多路复用(多个请求共享一个 TCP 连接,无队头阻塞);
头部压缩:HTTP/1.1 头部无压缩(重复传输大量冗余信息);HTTP/2 使用 HPACK 算法压缩头部,减少传输量;
服务器推送:HTTP/2 支持服务器主动向客户端推送资源(如 HTML 引用的 CSS/JS),HTTP/1.1 不支持。
8. 进程,线程,协程
三者是不同粒度的执行单元,核心区别:
进程:操作系统资源分配的基本单位(有独立的内存空间、文件描述符等),创建/销毁开销大,切换成本高(需切换地址空间);
线程:操作系统调度的基本单位(依赖进程存在,共享进程资源),创建/销毁开销中等,切换成本低于进程(无需切换地址空间);
协程:用户态的轻量级线程(由程序(如 Go 的 runtime)调度,而非 OS),创建/销毁开销极小,切换成本极低(仅切换上下文寄存器),依赖线程运行(多协程可映射到少量线程)。
9. Tcp,udp,以及应用场景
TCP 和 UDP 是 TCP/IP 协议栈中传输层的两种协议,区别及场景如下:
TCP:面向连接(三次握手建立连接)、可靠传输(通过确认、重传、拥塞控制保证数据不丢失、不重复、有序)、字节流协议;适用于对可靠性要求高的场景(如文件传输、HTTP/HTTPS、邮件等);
UDP:无连接(发送前无需建立连接)、不可靠传输(不保证数据到达,可能丢失或乱序)、数据报协议(按报文独立发送);适用于对实时性要求高、可容忍少量丢包的场景(如视频通话、直播、DNS 查询、游戏等)。
欢迎关注 ❤
我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。
没准能让你能刷到自己意向公司的最新面试题呢。
感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:面试群。
版权声明: 本文为 InfoQ 作者【王中阳Go】的原创文章。
原文链接:【http://xie.infoq.cn/article/df420377924d3050977645fbf】。文章转载请联系作者。
评论