誕生背景
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面試有了一個初步的概念,后面我們會逐步展開來看一看一些核心面試的考察點,并展開介紹一下這些技術點。