go 后端面试准备
一、Go语言相关
1、Go里有哪些数据结构是并发安全的?int类型是并发安全的吗?
sync
包中的类型
sync.Mutex
和sync.RWMutex
:互斥锁,通过加锁机制保证临界区安全sync.WaitGroup
:用于等待一组goroutine
完成sync.Once
:保证代码只执行一次sync.Cond
:条件变量,用于协调goroutine
间的交互sync.Map
:专门设计的并发安全的map
实现
- channel: Go 语言中最核心的并发原语,天然支持并发安全的通信操作
- atomic 包: 提供了原子操作,可以对基本类型进行安全的并发操作
2,Go如何实现一个单例模式? sync.Once
实现; 启动时初始化实例;
3,sync.Once是如何实现的,如何不使用sync.Once实现单例模式?
4,Go语言里的map是并发安全的吗?no
5,如果要实现一个并发安全的map,该怎么做?(分桶加锁)
使用互斥锁(sync.Mutex/RWMutex)包装 map; 使用标准库的 sync.Map;分片锁(Sharded Map)
6,Slice与数组的区别?
7,Slice的底层实现? struct{data *ptr,len ,cap}+指数级扩容机制
8,不同的Slice在复制和传值时,是深拷贝还是浅拷贝? 值类型是deep copy 指针类型是浅拷贝
9,sync.map的底层实现? 读写分离 和 延迟更新,优化 读多写少 场景的性能,读操作尽可能无锁执行。
10,sync.mutex的底层实现?
饥饿模式和正常模式结合;
- 用一个 32 位的
state
字段记录锁的状态(持有、唤醒、饥饿、等待计数)。 - 结合正常模式(性能优先,允许竞争)和饥饿模式(公平优先,避免饿死)。
- 通过快速路径、自旋优化减少阻塞,通过信号量实现 goroutine 的等待 / 唤醒。
11,如何判断一个结构体是否实现了某接口? 类型断言方式s.(MyInterface) ,反射包方式 reflect.TypeOf((*MyInterface)(nil)).Elem()
12,channel为什么不常用?(走社招流程的话,真心建议复习一下channel的使用方法,手撕时被坑了不止一次。。。)只在适合的场景(Goroutine 通信、简单同步)中才是最优解
13,channel在什么情况下会panic? close()后panic:end on closed channel;重复关闭同一个 channel; 关闭非 channel 类型的变量
14,介绍一下GMP模型
Goroutine(G)、Machine(M)和 Processor(P)三者的协作,高效地将用户态的 Goroutine 映射到底层操作系统的线程上执行。
15,如果有100个IO密集型协程,10个计算密集型协程,那么这100个IO密集型协程会对这10个计算密集型协程产生影响吗?根据自己对GMP模型的理解进行分析并得出结论
16,GMP模型相比于正常的协程-线程-进程调度,有哪些优点和缺点?
17,Grpc的实现原理
18,介绍一下Grpc实现过程中,经历了哪些层次?
19,相比于C语言,Go语言开发有哪些改进?
20,介绍一下Go语言的内存分配和垃圾回收机制?
21,Go语言在使用过程中,哪些情况可能会导致panic?
22,Go语言内存泄漏的排查思路
23,Go语言中context常用场景,及实现细节
24,Gin框架相比标准包,解决了哪些问题?
二、Redis相关
1,介绍一下redis在工作中的用途
2,redis在工作中一般可以承受多少的qps? 单机5-10 集群10w~100w QPS
3,redis有哪些数据结构,分别常用与哪些场合?
4,redis跳表实现细节,为什么选用跳表,而不选择红黑树和B+树?
5,redis中使用Lua脚本为什么能保证事务性? redis单线程和回滚特性 Lua 原子性
6,在分布式锁实现时,Setnx一定是可靠的吗,为什么(主从不一致)?
7,如果需要保证可靠,需要怎样的机制保证(Raft算法)?
8,redis为什么要防止bigkey?
9,redis是内存相关的数据库,那么有1G的数据,想要以key-value的方式存储,那么是每个key的数据多一些更占内存,还是少一些更占内存,根据所学的redis底层数据结构实现进行分析和回答
10,redis的网络IO模型介绍
11,epoll和select模型的区别
12,redis中TTL到期后是如何回收的?
13,在使用分布式锁时,如何保证解锁时是之前上过的锁?
14,使用redis实现分布式缓存时,需要注意哪些问题?
15,说下缓存击穿,缓存穿透,缓存雪崩有什么区别?
三、MySQL相关、Postgresql
1,索引的底层实现
2,为什么使用B+树,而不使用跳表?
3,MySQL分表怎么做?
4,如果要添加分表或删除分表,如何操作(一致性哈希算法)?
5,主键索引和唯一索引的区别
6,有遇到深翻页问题吗,如何解决?
7,在使用分布式缓存时,数据库和缓存的数据一致性如何解决?
8,MySQL自增主键,一定是自增的吗?有哪些方式会破坏这个性质
四、计算机基础
1,计算机网络的多层模型简要介绍
2,如果要做负载均衡,那么应该在哪一层上做文章?
3,TCP
4,http状态码
5,http2.0相比与http1.1的优化
6,DNS的实现细节
7,http协议中,如何判断该报文已经传送完所有的数据并结束?
8,https
五、算法相关
1,介绍Raft算法
2,主动轮询型和监听回调型有什么区别?分别应用在哪些场合?
3,介绍一下微服务架构,有哪些优点和缺点,为什么要使用微服务架构?
4,介绍一下CAP模型
5,介绍一下令牌桶限流算法
6,还有其他的限流算法吗,分别有什么优劣,适用于什么场景?
7,如何实现LRU缓存?
8,如何解决LRU缓存中刷盘的问题,即,业务中扫描了大量的数据,这些数据把LRU缓存占满,但是在之后不会再访问,导致缓存中存在大量非热点数据,如何解决?(LFU)
9,布隆过滤器,及其常用的业务场景
10,前缀树实现
六、K8S,docker相关
1,什么是声明式API?
2,Etcd数据库有什么特性,为什么K8S选用了Etcd数据库?
3,K8S中一个node的生命周期是怎样的?
4,服务发现机制介绍
5,docker的实现原理介绍
6,如果只是使用Linux命名空间进行分离,那么容器将很容易实现,docker相比于容器的核心竞争力在哪里?
7,Nginx介绍
8,Nginx在K8S中负责什么模块?
9,如何排查K8S中OOM的问题?
10,容器开发相比与虚拟机开发,有哪些优劣势?
11,容器隔离的不安全,有哪些根源上的原因?
七、项目相关(由于每个人的项目不同,问的问题也不同,一些方案已经隐藏在以上的问题中,不再重复赘述了)
1,分布式存储,如何解决分块上传问题(保证数据一致性)?(数据偏移+校验和)
2,节点不可达如何处理?(主从,raft算法保证一致性)
3,项目介绍,项目难点介绍
由于只有半年经验,通用项目方面介绍的问题比较少(简历上的项目相对冷门,很少问,在介绍时经常和面试官不在同一频道上。。。)
八、场景题
1,库存超卖问题
2,使用爬虫爬取URL时,能使用的内存空间只有1MB,如何过滤已经爬取过的URL?
3,在K8S架构中,如何处理单机或单容器限流问题,以免该容器负载过高导致整个node不可用?
4,如何处理长连接的负载均衡问题?
5,如果业务需要添加新的接口,但是在旧MySQL表中没有对应索引,如何解决?
6,如何处理单用户重复调用问题(翻译:如何保证多次操作的幂等性)?
7,技术选型时,如何做调研工作?