面试完第一反应是想笑
先来唠唠
组织内有位朋友最近刚经历了人生第一次面试,还是家大厂,面试完他自己都想笑。
他总觉得自己平时学的那些够应付了,结果一去面试就露了怯。面试官特别温和,问的问题也都扎实又专业,可他对着那些问题,好多都只能结结巴巴地卡着,半天说不完整句话。
之前总觉得自己学得还行,其实根本是自我感觉良好,跑过去面试还耽误了人家时间。
而且这样还会在大厂里面留下黑名单,后面还想约面就难了,所以在这里奉劝实习或者校招想要冲击大厂的同学,一定不要一开始就直接去大厂面试,先去其他的地方练练手。
下面也分享一下他整理的面经:
某大厂面经
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。
- 当所需容量(newcap)小于等于原容量(oldcap)的2倍时:
内存对齐优化:
扩容后的容量会根据元素类型的大小(elemsize)和内存对齐规则进行调整,确保分配的内存块是页大小的整数倍,提升内存访问效率。示例说明:
- 若原 slice 容量为 100,新增 50 个元素(需容量 150 ≤ 200),则扩容后容量为 200(2倍);
- 若原 slice 容量为 200,新增 200 个元素(需容量 400 > 400),则直接扩容为 400。
3. 带缓冲区channel关闭后的读写
带缓冲区的channel关闭后,读写行为不同:
- 读操作:若缓冲区还有数据,可正常读取数据(返回数据和true);当缓冲区数据读
