面试完第一反应是想笑

先来唠唠

组织内有位朋友最近刚经历了人生第一次面试 ,还是家大厂,面试完他自己都想笑。

他总觉得自己平时学的那些够应付了,结果一去面试就露了怯。面试官特别温和,问的问题也都扎实又专业,可他对着那些问题,好多都只能结结巴巴地卡着,半天说不完整句话。

之前总觉得自己学得还行,其实根本是自我感觉良好,跑过去面试还耽误了人家时间。

而且这样还会在大厂里面留下黑名单,后面还想约面就难了,所以在这里奉劝实习或者校招想要冲击大厂的同学,一定不要一开始就直接去大厂面试,先去其他的地方练练手。

下面也分享一下他整理的面经:

某大厂面经

1. go struct可以比较吗

在Go语言中,struct是否可以比较取决于其字段类型:

  • 若struct的所有字段都是可比较类型(如int、string、数组、指针等),则该struct可以比较,比较时会逐字段进行值对比;
  • 若struct中包含不可比较类型的字段(如slice、map、func等),则该struct不可比较,编译时会报错。

2. slice扩容机制(Go 1.18+ 版本)

Go 1.18 版本后,slice 的扩容规则发生了调整,更精确地控制内存分配,避免过度扩容。具体规则如下:

  1. 基础扩容逻辑

    • 当所需容量(newcap)小于等于原容量(oldcap)的2倍 时:
      • 若元素大小(elemsize)为 1、8 或 2 的幂次方,且 newcap 不超过 256,则扩容后的容量为原容量的 2 倍;
      • 否则,使用公式 newcap += (newcap + 3*256) / 4 逐步调整,直到满足需求。
    • 当所需容量大于原容量的2倍 时:
      • 直接使用所需容量作为初始 newcap。
  2. 内存对齐优化

    扩容后的容量会根据元素类型的大小(elemsize)和内存对齐规则进行调整,确保分配的内存块是页大小的整数倍,提升内存访问效率。

  3. 示例说明

    • 若原 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,备注:面试群。

相关推荐
Easonmax2 小时前
用 Rust 打造可复现的 ASCII 艺术渲染器:从像素到字符的完整工程实践
开发语言·后端·rust
百锦再2 小时前
选择Rust的理由:从内存管理到抛弃抽象
android·java·开发语言·后端·python·rust·go
小羊失眠啦.2 小时前
深入解析Rust的所有权系统:告别空指针和数据竞争
开发语言·后端·rust
q***71852 小时前
Spring Boot 集成 MyBatis 全面讲解
spring boot·后端·mybatis
大象席地抽烟3 小时前
使用 Ollama 本地模型与 Spring AI Alibaba
后端
程序员小假3 小时前
SQL 语句左连接右连接内连接如何使用,区别是什么?
java·后端
小坏讲微服务3 小时前
Spring Cloud Alibaba Gateway 集成 Redis 限流的完整配置
数据库·redis·分布式·后端·spring cloud·架构·gateway
方圆想当图灵3 小时前
Nacos 源码深度畅游:Nacos 配置同步详解(下)
分布式·后端·github
方圆想当图灵3 小时前
Nacos 源码深度畅游:Nacos 配置同步详解(上)
分布式·后端·github
小羊失眠啦.4 小时前
用 Rust 实现高性能并发下载器:从原理到实战
开发语言·后端·rust