诞生背景
Go由Google三位顶尖工程师(Ken Thompson、Rob Pike、Robert Griesemer)设计,目标是解决两大行业痛点:
-
硬件利用率不足:多核CPU普及,但C/C++等语言难以高效利用并发能力;
-
开发效率低下:C++编译慢、Java冗长,且内存泄漏问题频发
现状:
随着云计算(Docker/K8s)、高并发中间件(消息队列、数据库)等场景依赖Go,以及字节跳动等大厂从python迁移到了Go,进一步推动了Go语言的繁荣。 尤其是字节出来的各类技术人员,又进一步把Go的技术栈带到了各家公司。随手翻阅一下求职网站,我们可以发现各个大厂,包括字节、拼多多、腾讯都会有golang开发工程师的招聘
面试概述
从一个面试官的角度出发,一名合格的Golang后台开发工程师我们需要具备哪些的能力,这一个专栏的文章我们就来聊一聊这块,核心能力大概分这么几块:
1. Golang的基础知识
2. 项目的掌握情况
3. 架构的理解
4. 算法的能力
5. 管理能力
第四点算法的能力,如果是找中小厂的话,一般是不考察的。 但是如果想去字节等大厂,一般是会考察算法题的。
第五点从ld的角度出发的一个考察。
面试题初探
我们第一篇先略微提一些面试题,这些面试题是从网上收集的一些案例,可以看看各大厂究竟在面试哪些问题。
腾讯
一方面是通过电话直接沟通
- go的调度
- go struct能不能比较
- go defer(for defer)
- select可以用于什么
- context包的用途
- client如何实现长连接
- 主协程如何等其余协程完再操作
- slice,len,cap,共享,扩容
- map如何顺序读取
- 实现set
- 实现消息队列(多生产者,多消费者)
- 大文件排序
- 基本排序,哪些是稳定的
- http get跟head
- http 401,403
- http keep-alive
- http能不能一次连接多次请求,不等后端返回
- tcp与udp区别,udp优点,适用场景
- time-wait的作用
- 数据库如何建索引
- 孤儿进程,僵尸进程
- 死锁条件,如何避免
- linux命令,查看端口占用,cpu负载,内存占用,如何发送信号给一个进程
- git文件版本,使用顺序,merge跟rebase
字节一面(教育部门)
自我介绍,项目介绍
1.说说mysql的隔离级别
2.mysql的索引类型
3.项目里用了sqs,sns,有什么区别
4.mongo为什么不支持事务,mongo的速度,mongo的查询机制
5.redis的cluster内部是怎么高可用的,怎么选主
6.熟悉raft吗
7.算法题:有红黄蓝三种球,分别用123标识,每种颜色的球有n个,每种颜色的球数量相同,如122331213排列,要求123123123排列,要求时间O(n),空间O(1)
米哈游
一面摘录
-
Go 里面使用 Map 时应注意问题和数据结构?
- 可以通过定义 value 为 struct 来节约内存;
- 哈希分桶的结构,用哈希值的高八位和低八位分别来做桶内定位的依据和分桶的依据等;
-
Map 扩容是怎么做的?
- 依照 Redis 渐进式 rehash 的思路说了一版;
-
Map 的 panic 能被 recover 掉吗?了解 panic 和 recover 的机制吗?
- 不懂,但是实际上是不可以的,具体原因可以看看 Map 并发读写的时候抛出的是什么,是不是普通的 panic;
-
Map 怎么知道自己处于竞争状态?是 Go 编码实现的还是底层硬件实现的?
- 通过结构体中的标记位实现的,可能是通过 CAS 操作的;
-
CAS 具体是怎么实现的呢?
-
并发使用 Map 除了加锁还有什么其他方案吗?
-
有对比过 sync.Map 和加锁的区别吗?
-
说一下(Redis)分布式锁的实现?
- setnx / 唯一 value / ttl
-
基于 Redis 的分布式锁会有什么问题?
- 主从模型下同步不保证一致会导致锁失效
-
Redis 分布式锁超时可以超时时间设长一点可以吗?不可以的话需要怎么解决?
- 不根本解决问题,可以考虑旁路的 goroutine 不断自旋续期
-
对 Redis 锁续期这个怎么实现呢?
-
日常在用的 Redis 集群都是什么架构?在主从模式和 Redis Cluster 中分布式锁会有什么问题?
总结
我们对于Golang面试有了一个初步的概念,后面我们会逐步展开来看一看一些核心面试的考察点,并展开介绍一下这些技术点。