2024最新最全Java和Go面經,面試了30多場,終於上岸了!

王中阳Go1發表於2024-03-28

​> 本文來自我們技術交流群群友的投稿,未經授權,禁止轉載。

原文連結:太難了,Java和Go,面試了30多場,終於上岸了!

先聽一下他的故事

2023年10月份我就做好了離職跳槽的準備,做了3年Java後端開發的我,對自己的技術能力還是很有底氣的。之前雖不是一線大廠,也算是比較知名的中廠了。

加上前公司各種不合理的排期和需求,我感覺就是變相裁員,我這暴脾氣可不慣著這個。

我就請假約面試,沒想到,被社會毒打了,Java太捲了,要求好高,各種拷打底層。(加上我對Java確實不太感冒)另外我不是科班出身,是文轉碼,難頂呀

之前公司有事業部使用Go語言,那時候也瞭解了一些,加上不少Java群都在聊Go語言,我也準備轉Go試試。做兩手準備吧,這樣能更穩妥一點。

裸辭

哎,公司各種變態需求和排期。我們心裡都清楚公司是咋想的,我的很多同事都準備耗著,等補償。

我最開始也是這個想法,但是說實話,這種上班的日子每天都是煎熬。

之前也累,是加班趕專案的累。

現在的累,是心裡累,內耗的累,太難受了,在公司工作也不痛快,新東西也學不下去,很難做跳槽準備呀。

想請假面試也不批,咋搞!?

老子不慣著,裸辭了!

2024年元旦過後沒幾天我就裸辭了!

放鬆

因為之前公司太累了,裸辭之後踏踏實實在家裡休息了半個多月,睡到自然醒,自己做飯、遛彎、打球、逛街、爽。

然後也該準備好工作了,給自己制定計劃,準備踏踏實實學Go。我準備做Java和Go做兩份簡歷出來。

我覺得只是換個語言,問題應該不大,之前的專案經驗也是很豐富的,學唄!

長遠目標

我計劃是2024年3月底4月初能拿到Offer就行,反正手裡的錢也夠花。不著急呢。

春節也踏踏實實過,提前回家過年。

春節之後突擊一下,把Go基礎和併發程式設計好好搞搞,還有之前的專案經驗,好好梳理一下。然後就是各種突擊八股文,學!學!學!還是學!

另外堅持每天健身,好身體才能有好狀態嘛!

面試

春節之後,我是從3月份才開始約面的,到3月27號面試了大概20多家公司,參加了30多場面試。終於拿到合適的Offer了。

我本來是想衝一衝位元組這樣的大廠的,演算法也準備的挺充分的,一面自我感覺面試的不錯,但是不知道為啥沒過...

後來分析,可能是被卡學歷,卡專業了吧

目前手上有2個Offer,選擇了其中更合適的一家,薪資漲幅不小,對得起我這兩三個月的付出。

好了,下面我就給你分享一下我的Go面經,也祝大家能早日上岸,順利找到工作:

杭州默安

1.slice切片(一定看底層結構體實現)

2.GMP模型

3.聊聊什麼是鎖. Mutex, RWMutex, redis分散式鎖。

這塊聊的很深, 差不多10分鐘,甚至問了鎖的狀態在硬體上是怎麼記錄的

4.go的GC原理以及寫屏障是什麼

5.docker的六大名稱空間?

每個容器有自己的名稱空間, 包括網路,程序,IPC, 檔案系統等. 透過這種方式, 容器之間相互完全隔離, 不會相互影響

  1. 程序名稱空間: 為每個容器建立一個新的程序程序ID(PID)空間, 使得容器內的程序看起來像是獨立的作業系統中的程序
  2. IPC名稱空間:
  3. 網路名稱空間
  4. 掛載名稱空間
  5. UTS名稱空間
  6. 使用者名稱空間

6.網路七層模型?

應用層, 表示層, 會話層, 傳輸層, 網路層, 資料鏈路層, 物理層

7.演算法:

  • 口述堆排序
  • 如何判斷連結串列是否有環

8.mysql如何儲存ip地址比較合適?如何查詢效率比較高?

  1. 使用varchar儲存 浪費空間,無法直接實現範圍查詢
  2. 使用int數值儲存 佔用空間較小
  3. 使用binary二進位制位儲存

前海匯流

1.https和http的區別?

2.https的加密是對稱加密嗎?

內容傳輸是對稱加密, 證書校驗是非對稱加密

3.瀏覽器輸入谷歌地址, 請描述整個訪問過程發生了哪些步驟?

4.tcp三次握手四次揮手? 如果只有兩次會出現哪些問題?

5.聚簇索引和非聚簇索引的區別?

6.b+樹索引的特點?

7.DNS域名解析過程

8.一道sql題

資料庫中有以下兩張資料表:

廣告表
表名:ad
欄位:id, title, create_time

訂單表
表名:order
欄位:id, ad_id, cost, create_time

請寫一條 SQL,查詢訂單數量最多的前十條廣告,並返回以下資訊:
廣告ID、廣告名稱、訂單數量總和、訂單費用總和。

雲智創心

1.grpc底層用的什麼協議?

http2.0

2.http2.0和1.1的區別?

  1. 多路複用: 1.1每個請求必須是獨立的TCP請求, 2.0採用多路複用, 一個TCP連線可以進行多次請求, 大大提升效能
  2. 資料傳輸: 2.0引入資料流的概念, 允許不同請求在同一連線交錯傳送
  3. 頭部處理: 2.0 採用HPACK演算法對頭部資料進行壓縮, 降低資料大小和網路開銷
  4. 二進位制協議: http/1.1報文頭資訊必須是文字, 資料體可以是二進位制,也可是文字。2.0 頭資訊和資料體都是二進位制, 更加高效的處理資料
  5. 錯誤處理: 1.1處理錯誤需要關閉連線, 2.0引入可以在不關閉連線的情況下處理錯誤

3.gRPC有幾種請求模式?

  1. 簡單模式: 客戶端發起請求, 等待服務端響應. (例如普通的grpc定義message, 一次請求一次響應)
  2. 服務端流式(長連線): 客戶端傳送請求, 服務端返回一個流, 客戶端持續監聽這個流, 反序列化其中的內容, 返回給使用者,適用於客戶端需要向服務端傳送大量資料的情況, 如檔案上傳
  3. 客戶端流式(長連線): 客戶端建立一個流, 將請求引數以流的方式給服務端, 服務端再返回單個響應, 適合服務端向客戶端傳送大量資料的情況, 例如實時資料傳輸
  4. 雙向流式: 允許客戶端和服務端同時讀寫資料. 雙方都可以隨時開始和結束資料的傳送. 適合雙向資料傳輸模式

傳統的http連線時短連線, 一次請求一次響應後, 連線就斷開了, 然而, 客戶端流式RPC和服務端流式RPC模式基於TCP長連線, 用於多次資料交換.

4.protobuf瞭解過嗎? 和有什麼區別? 對比json有什麼優勢? 壓縮率對比json來說能達到多少?

和json的對比:

  1. protobuf使用二進位制格式, json為文字格式, 所以protobuf的序列化和反序列化更加高效
  2. 由於使用二進位制傳輸, protobuf的體積通常更小
  3. protobuf是強型別的, 定義資料結構時必須指定每個欄位的型別, 可以減少解析時的錯誤, json是弱型別的, 不強制欄位的型別

5.var定義slice, 不使用make宣告, 可以直接使用嗎? 陣列可以直接使用嗎?為什麼

切片不能直接使用. 如果不進行make, 那麼切片是nil, 不能直接使用

陣列可以直接使用, 陣列在建立時已經固定了大小, 會被立即分配記憶體

6.go中有幾種方式可以解決併發安全問題?

1.併發原語2.mutex鎖3.channel

7.mysql中,如何判斷一個欄位是否適合建立索引?

  1. 該欄位是否經常作為查詢條件
  2. 區分度高的欄位
  3. 列的資料型別。文字欄位建立索引佔據更大空間, 數值欄位效率更高
  4. 更新頻率。如果是經常發生寫操作的欄位,由於需要維護b+樹的索引結構,會降低效率。

8.如果讓你設計一個訊息佇列,你會如何設計?需要考慮哪些問題?

9.專案中限流是如何設計的,使用的是go-sentinal.

10.如果讓你設計限流器,你如何設計?

令牌桶\滑動視窗演算法\漏斗演算法

中軟國際

  1. 口述使用者註冊功能的整個流程, 如果兩個請求同時使用相同使用者名稱進行註冊, 如何保證註冊邏輯正確

  2. 演算法: 合併區間

網心科技

1.一個訪問url是如何找到微服務的?

2.一次完整的url請求過程

3.RPC協議瞭解嗎?grpc協議瞭解嗎?

4.restful請求和RPC協議的區別?

5.rpc通常是長連線還是短連線?

6.webSocket是長連線還是短連線?

7.主鍵索引和非主鍵索引的區別?

8.mysql中union和union all的區別?

union: 對兩個結果集進行並集操作, 不包括重複行, 相當於distinct, 同時進行預設規則的排序

union all: 對兩個結果集進行並集操作, 包括重複行, 即所有結果全部顯示, 不管是否重複

9.exist和in的區別?

in函式執行的原理:

先查詢in中的語句, 講結果快取, 然後使用主查詢結果, 匹配in中的快取結果, 所以in中的資料量如果是比較小的, 那麼查詢效率快, 否則拖慢查詢

10.索引最佳化?

11.context是如何使用的?

12.引用型別有哪些?

13.map是執行緒安全的嗎?

14.go中的struct能否進行比較?

15.range迭代map是有序的嗎?

16.場景: 製作登入系統, 允許手機端, pc端, 平板端多端登入, 一旦有一端修改密碼, 其它端登陸態失效, 如何設計?

17.給定一個整數陣列, 判斷該陣列是否有序(注意: 升序或者降序都判斷為有序)

卓易科技

1.介紹一下gin中的中介軟體? (如何自定義一箇中介軟體)

2.gin的攔截器有c.next放行的方法, 那麼它是如何做到執行完畢鏈路方法之後, 又返回到當前攔截器位置的呢?

c.next() c.abort()

gin的中介軟體實際上還是gin.HandlerFunc, 和其它處理器是一樣的

執行完next之後, 又返回當前中介軟體的特性, 依賴go語言的閉包和函式執行棧實現.

執行next放行後, 將當前函式入棧, 直到遇到c.Abort()返回, 然後根據原來的鏈路反向執行回去, 而且閉包允許引用函式外的變數和函式,返回時可以直接正常執行

3.切片的擴容機制?

4.記憶體對齊?

記憶體對齊是計算機硬體對記憶體資料訪問的一個最佳化手段。當資料在記憶體中的地址是某個固定大小的整數倍時,處理器訪問該資料的速度會更快。
這種最佳化可以減少處理器訪問記憶體的次數,提高程式的執行效率。

例如,一個int32型別的變數在32位處理器上通常需要對齊到4位元組的邊界,而在64位處理器上可能需要對齊到8位元組的邊界。如果不對齊,處理器在訪問這些資料時可能需要進行額外的記憶體操作,這會影響程式的效能。

5.索引? 回表查詢?

6.mysql中的資料是如何載入到記憶體中的, 如何寫入到磁碟中的?

7.開啟了事務, 剛執行完插入, mysql當機, 如何保證的這條資料不插入成功

8.redis是怎麼使用的? redis的訂閱和釋出?

9.http狀態碼: 1開頭的

10.get和post的區別? (網路層面)

11.給定兩個陣列, 求兩個陣列的交集

12.陣列長度為30億, 最小數字為1, 最大數字為35億, 判定給定的數字是否出現在陣列中

廣州山海娛樂

1.假設有一臺本地及其,無法做加減乘除運算, 我們提供了一個伺服器端的Http API, 可以串兩個數字型別的引數, 響應結果是這兩個引數的和, 請寫一個高效的函式, 呼叫遠端方法, 計算出結果

2.redis常用的型別? 以及使用用途

3.場景: 基於redis實現限流, 每分鐘限定使用者只能訪問100次, 如何實現?

使用sort set, 分數設定為訪問時間, 訪問時間-60秒, 判斷有多少個請求, 如果大於100, 則不允許請求

4.mysql失效場景?

mysql自動評測,如果資料量小, 不走索引, 當使用order by時, 如果發現走索引的效率比較慢, 也會捨棄索引

5.索引最佳化做過哪些最佳化?

6.最左字首法則的原理是什麼?

7.id, name兩個欄位, where name like %abc%, 有1000萬資料, 怎麼進行最佳化?

先根據name查詢id, 再根據id查詢出所需要的欄位

8.prometheus怎麼使用的? 儲存型別是什麼?

9.kafka如何保證的訊息有序?

10.有併發場景嗎?

11.講一下整個服務的元件鏈路

貝聯珠貫

1.waitGroup, 如果有一個協程卡死了, 不返回context處理, 定義超時時間, 和公共狀態, 如果出錯了, 協程中使用context處理超時, 並且講公共裝填設定為true

2.你們的流量表資料量有多大?

3.抓取一次介面資料要響應時間要多久?

4.快取?

5.輸出100個100以內加減法

小白羽

1.每天的線索量有多少?

2.GMP模型

3.Innodb的ACID是如何保證的?

4.微博熱搜功能如何實現? 小頂堆+redis排序

5.給定a,b兩個字串, 判斷字串b是否為字串a的子串

前海匯流

1.http和https的區別?

2.https用的是對稱加密還是非對稱加密?

3.b+樹索引結構的特點? 底層的葉子節點起到的作用是什麼?

4.聚簇索引和非聚簇索引的區別?

貝聯珠貫

1.表中資料量有多大?

2.哪些適合記憶體儲存? 哪些適合mysql查詢?

3.索引最佳化?

4.開發使用的是什麼框架? 如果要實現介面鑑權效果, 怎麼實現?

5.瞭解規則引擎嗎? 如果自己設計狀態機, 如何設計?

6.場景題: 一個日誌檔案, 有100萬行, 其中每一行可能出現重複的日誌, 請找出前50條重複次數最多的日誌

7.小頂堆排序的時間複雜度是多少?

8.有使用過channel嗎

9.sql執行慢的原因? 如何排查?

  1. 檢視是否建立了索引, 索引是否生效。解決方案: explain檢視索引命中情況,以及查詢時間
  2. 單表資料量過多,導致查詢瓶頸。解決方案:水平分表,垂直分表,分庫: 例如已經拆分萬1000張表,將0-100放到同一資料庫例項中,將100-200放到另外一個資料庫例項中,依此類推把1000張表存放到10個資料庫例項中。 這樣根據業務主鍵將請求路由到不同的資料庫例項, 從而讓每個資料庫例項的流量比較小, 達到提高資料庫效能的目的。
  3. 網路原因導致機器負載過高,可以部署一主多從的mysql叢集,提高mysql的查詢處理效能
  4. 熱點資料導致單點負載不均衡。

10.程序與執行緒的區別:

  1. 本質區別:程序是作業系統分配資源的最小單位,執行緒是處理器任務排程的最小單位
  2. 包含關係:一個程序至少有一個執行緒,執行緒是程序的一部分
  3. 資源開銷:同一程序內的執行緒共享程序的地址空間,每個執行緒都有自己獨立的執行棧和程式計數器,執行緒間切換的開銷小
    4.影響關係:一個程序崩潰後,其它程序不受影響。 一個執行緒崩潰,可能導致所屬程序被系統殺掉

11.slice的擴容機制:

go1.18版本後, 擴容使用threshold為臨界點(原始碼中設定為256)

當slice容量 < 256時, 每次擴容為原來的兩倍。當slice容量 > 256時, 每次增加(oldcap + 3*threshold) 3/4

12.tcp和udp的區別?

  1. 連線: tcp需要建立連線 udp不需建立連線
  2. 服務物件: tcp是一對一, udp可一對一, 一對多
  3. 可靠性: tcp可靠, 有序, udp不可靠, 無序
  4. 擁塞控制,流量控制: tcp擁有擁塞控制和流量控制, 保證資料傳輸的安全性, udp即使網路非常擁堵, 也不影響udp的傳送速率
  5. 傳輸方式: tcp為流式傳輸, 沒有邊界, 但保證順序和可靠, udp是一個包一個包傳送, 有邊界, 但是可能丟包或亂序
  6. 首部開銷: tcp的首部開銷大, udp的首部只有固定的8位元組,開銷小

13.restful請求?

get: 表示讀取伺服器上的資源
post: 表示在伺服器上建立資源
put: 表示更新或者替換伺服器上的資源
delete: 表示刪除伺服器上的資源
patch: 表示更新/修改資源的一部分

14.restFul請求和http請求的區別?

http 是一種應用層協議, 它定義樂客戶端如何與伺服器進行通訊, 包括請求和響應的格式.
restFul是一種軟體架構風格, 依賴於http協議來實現, 然後根據對資源的不同操作型別, 劃分為不同的restful請求

15.什麼是grpc? protobuf/json區別與優勢?

  1. grpc是遠端呼叫框架,基於http2.0實現,允許在計算機之間進行跨語言,跨平臺通訊,使得構建分散式系統更加簡介高效
  2. grpc使用protocol buffer作為預設序列化機制,比json更加高效

嗶哩嗶哩

演算法1: 順時針旋轉矩陣

演算法2: 合併區間

位元組跳動

1.介紹一下業務表的欄位

2.定時任務重新整理欄位, 是怎麼實現的?

3.分散式鎖? 分散式死鎖如何解決? 看門狗機制? 如何避免當前執行緒加的鎖, 被其它執行緒解鎖?

4.樂觀鎖和悲觀鎖的區別? 寫多讀少的情況, 應該使用樂觀鎖還是悲觀鎖?

5.分散式場景下, 如何實現樂觀鎖?

6.kafka的冪等性? 如何避免訊息被重複消費?

7.兩個執行緒, 同時向mysql中插入一條資料?

8.kafka如何保證訊息不丟失

9.sql最佳化場景:

select id,name,balance from account where update_time > '2020-09-19' limit 100000, 10

該語句為什麼查詢慢? 有什麼最佳化思路?

  1. 演算法題: 子集

客路航運

1.http和gRpc的區別?

2.mysql,redis,mongoDB,ES 說說如何根據使用場景,選擇對應的儲存元件?

3.線上的介面效能差, 如何排查和提高?

4.redis常見的資料結構?

5.找出連結串列的倒數第N個節點。如何判斷連結串列有環?

6.分庫分表如何設計?
場景: 例如本訂單表是按照id進行的分表, 但是有的查詢, 需要根據id進行查詢, 有的查詢需要根據活動id查詢, 如何實現這個分表方案?

  1. 按照id進行分表 再按照活動id進行分一次表
  2. 如果事務要求不高, 可以將活動的資料同步到ES, 使用es進行相關查詢
  1. protobuf相較於json的優勢?
  1. 效率高:protobuf使用二進位制編碼,編碼解碼速度更高,體積更小
  2. 可讀性: 雖然protobuf是二進位制格式,但是其定義檔案是可讀的,大型資料結構情況下,更加易於維護和理解
  3. 跨語言支援:protobuf支援多種程式語言

8.redis中的資料型別?底層結構?

redis list的邏輯類似雙向連結串列,每個節點有next,prev兩個指標,和一個value指標真正儲存值,如果單純使用雙端連結串列,會出現問題

  1. 如果每個node節點中,value指標指向的資料很小,比如只儲存了一個int值,那麼prev,next指標佔據的Node節點的絕大部分的空間,真正儲存資料的有效負載就很低,連結串列節點出現很多的話,就會出現很多不連續的記憶體碎片
  2. 連結串列查詢時,需要沿著連結串列順序進行查詢,所以雙端連結串列的查詢效率低

redis7.0前的版本為解決上述問題,實現了quickList的結構,將Node節點的value指標,指向一個ziplist例項,ziplist是一塊連續的空間,可以儲存多個list的元素,這樣quickList與普通連結串列相比,Node節點數量會更少,記憶體碎片也更少,而且一個Node中存放了多個元素,prev,next指標佔據的空間比例很少,有效負載變得很高

ziplist雖然是一塊連續空間,但是不能像資料一樣進行隨機訪問,查詢元素的時候同樣需要從頭開始掃描,但是ziplist是一塊連續空間,就不會像Node查詢一樣有很多指標解析的開銷,資料量少時,迭代一遍的效率比較快

9.漸進式rehash?

在resis使用過程中,當雜湊表已經到達容量上限,redis透過rehash進行rehash進行擴縮容。但是,redis執行命令時單執行緒模型,對當前雜湊表進行rehash時,一次rehash操作可能導致伺服器出現阻塞並停止對外服務。為解決該問題,使用漸進式rehash方案,就是將rehash分為多次完成。在redis中,字典資料結構底層使用兩個全域性雜湊表實現,為方便理解稱之為雜湊表1和雜湊表2。另外,字典還維護一個rehashIdx欄位,來記錄rehash操作的下標位置,初始值為-1,代表未進行rehash操作

漸進式rehash的詳細步驟:

  1. 首先為雜湊表2分配空間,預設長度時雜湊表1長度的2倍
  2. 設定索引計數器變數rehashInx為0, 表示rehash工作正式開始
  3. 在rehash進行期間,每次對字典執行增刪改查操作時,除了執行指定的操作以外,還會把雜湊表1在當前rehashInx索引上的所有鍵值對rehash到雜湊表2。 當rehash操作完成之後 rehashInx屬性的值就會+1
  4. 隨著字典增刪改查操作的不斷執行,最終所有鍵值對都會被rehash到雜湊表2中。rehash操作完成之後,雜湊表1table陣列的指標指向雜湊表2 table陣列的指標, 雜湊表2 table陣列的指標指向 null, 並將 rehashIdx 屬性的值設定為-1, rehash操作完成

注意:

  1. 在漸進式rehash進行期間,字典的刪除,查詢,更新等操作,會在兩個雜湊表上執行
  2. 在漸進式rehash執行期間,字典的新增操作權在 雜湊表2 上進行
  3. rehash後新的下標為N或者N+size,N+為原下標,size為原陣列大小

10.分庫分表:如果分表策略, 不能滿足查詢條件要求, 怎麼處理?

方案1: 按照多個查詢條件, 拆分為多個冗餘表。方案2: 例如按照id拆的,那麼正常拆,正常拆,不重要的查詢欄位, 將資料同步到es中, 走es查詢

富途

1.kafka如何做的容災?

2.kafka的效能為什麼高?

3.使用者態和核心態?

4.mysql的容災如何做的?

5.mysql從庫的同步模式?

  1. 非同步複製: 預設為非同步同步. 主庫提交事務後, 立即返回給客戶端, 不關心從庫是否已經接收並處理.問題: 如果主庫當機, 由於主庫資料沒有同步到從庫, 可能導致資料丟失
  2. 全同步複製: 主庫執行完事務, 必須等到所有從庫執行同庫完畢, 才算事務執行成功
  3. 半同步複製: 主庫至少需要等待一個從庫接收並寫入RelayLog檔案即可.

6.資料庫的事務隔離級別是什麼? 遇到過幻讀嗎? 如何解決幻讀?

幻讀: 當前事務查詢不到對應資料, 但是插入該資料插入不進去

7.mysql中有哪些鎖?

行級鎖, 表級鎖

8.go如何啟動一個協程?

9.協程和執行緒的區別?

10.程序和執行緒的區別?

11.有執行緒為什麼還需要協程? 主要是對執行緒的哪個問題進行了最佳化?

12.linux的硬連結和軟連線?

13.go的記憶體逃逸?

14.interface一般都是怎麼使用的?

15.https如何保證的安全?

16.https連線的金鑰流程?

公鑰是公開的, 私鑰是服務端私有的, 客戶端先傳送請求,服務端接收請求後, 服務端根據公鑰對 響應回公鑰

17.time_wait是解決什麼問題的?

18.演算法: 最長迴文子串?

360

1.協程池的作用?

2.記憶體逃逸分析?

3.go的記憶體回收什麼條件會觸發? go的GC能夠手動觸發嗎?

4.channel的底層實現? 有緩衝的,無緩衝的channel, 如果管道已經關閉了, 讀取會不會發生錯誤?

5.切片使用的時候需要注意什麼?

6.go中的引數傳遞是值傳遞還是引用傳遞?

7.defer的執行順序?

8.100G的檔案, 統計出所有英文字母, 按照字母表順序輸出

9.linux如何分割檔案?

10.介面效能如何最佳化?

11.什麼情況會全表掃描?

12.主叢同步的原理? mysql還有什麼相關的log檔案?

13.分散式鎖的原理?

樂信

1.專案中用到哪些設計模式?

2.promethus如何使用的?

3.協程池自己實現的還是第三方包? 協程池的功能有哪些? sync.Pool的回收機制

4.如何獲取程序中執行的協程數量?

5.遇到的線上故障有哪些?

6.線上go程式佔用記憶體是多少?

7.介面最佳化思路?

8.線上每張表的資料量有多大?

9.如何提升資料庫層面的效能

10.ES如何使用的? 倒排索引的原理是什麼?

11.自己實現過哪些資料結構?

12.使用者10分鐘內, 如何只看到同一條廣告

13.go語言和java語言的差異點

14.GC回收原理

15.專案中的難點

16.go應用突然掛了, 都有哪些原因? 如何排查?

17.recover能夠捕捉到子協程的錯誤嗎?

酷狗音樂

1.mysql儲存引擎?

2.mysql隔離級別? 分別解決了什麼問題?

3.2pc, 3pc 演算法

4.10億個資料獲取前100個最大資料?

5.單個表到達多大要進行拆分? 為什麼需要拆表?

6.redis哪些使用場景?

7.服務的熔斷降級?

8.平時如何提升和學習?

9.TCP和UDP可以繫結同一個埠嗎?

10.linux如何檢視cpu, 記憶體負載?

11.程序間通訊有哪些方式?

12.redis的資料型別?

13.redis和mysql的一致性問題?

AfterShip

1.最熟悉,最有收穫的專案

2.協程池使用的第三方包還是自己實現的?

3.GMP中, P的數量大小預設是多少? P的數量是固定死的還是可以手動調整的?

cpu核心數. 可以透過設定環境變數 GOMAXPROCS來調整P的數量

4.kafka的一致性? kafka預設的ack級別?

一致性: 可靠性, 冪等性, 有序性.預設ack級別為1

5.kafka掛了, 如何保證非同步訊息不丟失?

  1. 設定ack級別為-1, 所有副本都收到才算成功寫入
  2. 設定重試次數, 傳送失敗可以重試
  3. 開啟冪等性, 確保重試也不會產生重複的訊息
  4. 將訊息寫入mysql資料庫, 然後再非同步傳送到kafka

6.kafka事務訊息?

指生產者向kafka傳送訊息時, 要麼全部傳送成功, 要麼全部傳送失敗並回滾.

確保了訊息的一致性,原子性操作和精準一次消費.

生產者產生一條事務訊息, 獲取一個事務id, 傳送事務訊息時, 是同步傳送的, 保證訊息一定順利寫入broker

如果傳送的是非同步訊息, 對於生產者來說, 傳送後即顯示傳送成功, 但是下游broker的ack級別如果是-1, 那麼只有該訊息全部副本同步成功, 才算傳送成功,所以非同步訊息還是會受ack級別影響.

7.口述堆排序的原理?

8.聊天系統如何直到客戶是否線上? 使用者聊天使用的是長連線還是短連線?使用websocket連線, 還需要自己實現心跳保活嗎?

不需要, websocket自己已經實現了心跳保活機制, 只需要設定pingInterval和pingTimeout即可

百度

1.GMP模型?

2.協程建立後如何排程?

先進入p的私有佇列, 如果滿了, 進入全域性佇列

3.context的結構和用法

4.一次url的請求過程?

5.請求到達專案伺服器後的呼叫鏈路

6.nginx是否為單例的.

7.演算法: 兩數相除

8.平時mysql最佳化的案例?

9.in, exist的使用

10.聯合索引

11.binlog日誌

12.分散式事務: 下游兩個db使用redis, 需要更新這兩個不同的db, 如何自己實現最終一致性

13.兩階段提交, 三階段提交?

歡樂互娛

1.slice和array的區別?

2.map是否併發安全?

3.channel相關? 如果沒有初始化, 可以寫嗎? 可以讀嗎?已經關閉了, 再寫?

4.如果是無緩衝型別管道? 讀取和有緩衝的區別?

5.select監聽多個管道

6.10個goroutine想要順序執行, 如何實現?

7.10個協程同時執行, 如果其中有一個協程產生了錯誤, 其它協程停止執行, 如何實現?

8.如果controller方法中啟動了一個go協程, 如何保證該協程和方法的生命週期一致?

9.介面效能最佳化?

10.分庫分表? 水平分表, 垂直分表

11.專案中技術難點?

12.kafka重複訊息問題?

13.ES如何使用的? ES的延遲?

14.一個服務已經跪了, 但是其它服務依賴該服務,如何在編碼層面處理?
15.nginx具體的處理過哪些問題?

16.埠有大量的time_wait如何解決?

  1. 減少time_wait的等待時間
  2. 檢查連線池是否夠用

17.場景題: 兌換碼永久有效, 海量玩家同時進行兌換, 如何設計?

快取, 布隆過濾器.

18.演算法題: 函式只能勝場1-5的函式, 請實現生成1-7的函式

迴響科技

1.服務註冊和發現?

2.grpc的序列化和反序列化協議?

3.設定分散式鎖的命令? setnx

4.redis的事務? redis執行lua指令碼, 為什麼lua指令碼能夠保證原子性執行?

redis是單執行緒的, 會把當前指令碼執行完後再執行其它命令

5.redis的持久化方式? AOF在持久化時的最佳化策略?

當檔案超過某個閾值時, 儲存當前檔案的快照, 舊的AOF檔案就捨棄不用了, 因為只需要記錄資料最新的狀態即可

6.sort set的底層實現?

7.kafka的結構? ack預設級別?

8.有序性如何保證?

9.使用者表? 欄位為性別, 1和2 適合建立索引嗎? 建立索引反而導致查詢變慢的原因?

10.最左字首法則?

11.訂單列表, 越往後翻越慢, 原因是什麼? 如何進行最佳化?

12.es用過嗎?

13.訂單定時關閉? 延遲佇列?

rocketmq, kafka本身沒有實現延遲訊息佇列的功能.

kafka:
常見的實現方式可以使用主題分割槽和時間戳, 可以建立一個專門用於延時訊息的主題, 該主題建立多個分割槽, 將要延時傳送的訊息傳送到該主題, 設定訊息的期望執行時間. 消費者訂閱該主題, 按照時間順序消費訊息, 判斷當前時間是否到達了訊息設定的執行時間, 如果達到則執行相應的操作, 否則將該訊息重新傳送到延遲佇列

rabbitmq:ttl+死信佇列實現延遲佇列, 可以給指定佇列或者訊息設定ttl過期時間, 一旦到達過期時間, 那麼會稱為死信, 可以傳送到指定的死信佇列

14.時間輪演算法?

15.多協程編排? waitGroup的實現?

16.單例模式

17.層序遍歷二叉樹

好未來

1.為什麼要自己實現大頂堆? 大頂堆和小頂堆的使用場景?

2.如何利用堆, 獲取第k大的元素? 堆如何刪除某一個特定的節點? 大頂堆如何轉換為一個小頂堆?

3.引入mq, 實現非同步提速, 如何理解?

4.協程池使用的是第三方包嗎? 如果自己實現一個協程池, 描述你的思路?

5.recover能捕獲到其它協程的panic嗎?

6.說一下對grpc的理解? grpc互相呼叫, 如何實現互相的許可權驗證和授權?

7.http2.0 的tsl三次握手過程?

8.grpc中, 如果客戶端需要向服務端傳送大檔案, 如何實現? (使用客戶端流模式)

9.http2.0的相關特性? 其中的多路複用為了解決什麼問題? (解決對頭阻塞問題)

10.grpc中的deadLine和timeout, 應該怎麼用?
grpc的流控是如何處理的? 滑動視窗控制傳送和接收速速率?

11.go-zero中的服務熔斷和限流是怎麼做的?

12.以下兩個程式碼片段輸出的結果:

func test()  int {
    result := 1 
    defer func() {
        result++
    }

    return 0
}

func test() (result int) {
    result = 1 
    defer func() {
         result++
    }

    return 0
}

酷狗音樂(二面)

1.專案中涉及到哪些監控? prometheus

2.佇列出現訊息積壓, 如何處理?

3.訊息冪等性?

4.一個sql語句, 已經建立了索引, 但是突然查詢很慢, 如何排查?

5.索引失效場景?

6.mysql如何解決的幻讀?

select ... for update: 保證當前事務中查詢的範圍加鎖, 不被其它事務修改

7.做索引最佳化, 如何減少回表次數--索引下推

索引下推: 指將上層(服務層)負責的事情, 交給下層(引擎層)處理.

不使用索引下推: 根據索引中的主鍵值, 定位並讀取完整的行記錄, 然後將記錄交給server層去檢測該記錄是否滿足where條件

使用索引下推: 獲取索引, 判斷索引是否符合條件範圍, 如果滿足, 再進行對應的回表查詢獲取主鍵, 如果不滿足, 直接過濾掉

8.分散式事務, 二階段提交, 三階段提交的區別?

9.linux檢視網路io的命令? netstat

10.如果出現大量time-wait狀態, 如何處理?

11.網路的擁塞控制?

好未來(二面)

1.限流演算法

2.redis的叢集和分片

3.cap理論

度小滿

1.限流演算法 nginx預設使用的是哪種限流演算法?

2.redis常用的資料結構

3.redis的快取擊穿, 快取穿透, 快取雪崩 以及相關的解決方案

4.redis中記憶體滿了, 繼續寫入, 會發生什麼?

  1. LRU演算法刪除資料
  2. 刪除帶有過期時間的鍵
  3. 隨機刪除鍵
  4. 不刪除任何鍵, 返回錯誤

5.redis清理過期key的時機? redis刪除key時, 是新啟動一個程序處理刪除任務嗎

6.redis中有大量的key都是長期有效的, 現需要掃描所有的key, 進行特殊判斷, 符合條件進行刪除

7.redis的刪除命令 del

8.redis的掃描命令: scan和keys的區別? 對redis的效能是否有損?

keys: 用於返回匹配指定規則的所有鍵, 類似mysql中的like模糊匹配功能

問題1: keys需要將所有redis中的鍵都遍歷一遍,對效能影響較大

問題2: keys命令是一個阻塞命令, 直接阻塞其它客戶端對redis的訪問

線上一般嚴禁使用keys命令, 由於資料量過大, 可能一個命令直接導致redis不可用

scan命令:

  1. scan命令的時間複雜度也是O(N), 但是它是分次進行的, 不會阻塞執行緒
  2. scan命令提供了limit引數, 可以控制每次返回結果的最大條數

但scan命令返回的結果可能出現重複, 需要客戶端去重.

9.mysql事務四大特性, 隔離級別? 是否解決了幻讀?

10.mvcc採用的是什麼日誌檔案?

11.select ... for update使用的是當前讀還是快照讀?

當前讀

12.mysql的調優經驗? 索引下推?

13.主鍵索引和唯一索引的區別?

14.sql語句: 表中有name, city欄位, 查詢city中人數前三的資料

15.引用型別和值型別的區別?

16.切片的擴容機制

17.map是否為併發安全的? context是否為併發安全的?

在Go語言中,context.Context 是併發安全的。
這意味著你可以在多個goroutine之間安全地共享和傳遞同一個 context.Context 例項,而無需擔心資料競爭或其他併發問題。

context.Context 的設計考慮到了併發程式設計的需求,它內部使用了適當的同步機制來確保在多個goroutine訪問時能夠保持正確的狀態。因此,你可以放心地在多個goroutine中使用同一個 context.Context 來傳遞取消訊號、超時資訊或其他後設資料。

感謝分享,一起上岸

感謝群友的分享,希望這篇最新面經對大家有幫助。

更多面經請關注公眾號:王中陽Go

或者加我微信:wangzhongyang1993 備註:Go學習

原文連結:最新Go面經,看完你就是下一個Offer收割機

相關文章