天天看點

【Golang】Go 3到5年常見的面試題

1、go中常量是怎麼實作

2、go struct能不能比較

因為是強類型語言,是以不同類型的結構不能作比較,但是同一類型的執行個體值是可以比較的,執行個體不可以比較,因為是指針類型
           

3、go defer(for defer),先進後出,後進先出

func b() {
    for i := 0; i < 4; i++ {
        defer fmt.Print(i)
    }
}      

4、golang的make和new的差別是什麼

new有點像c++裡面的new,用來初始化各種type,然後傳回其指針。 隻不過由于沒有構造函數的存在,是以全部用零值來填充,比較特殊的是slice,map,channel, 它們的零值都是nil。另外由于golang直接可以用&struct{} 形式來初始化,是以平時用到new的機會也比較少。

make是用來初始化map,slice,以及channel的, 它傳回的不是指針,而是對象本身。另外,make出來的map,slice,channel都是可以直接使用的。

5、golang 的channel是怎麼實作的

golang的channel是個結構體,裡面大概包含了三大部分:

a. 指向内容的環形緩存區,及其相關遊标

b. 讀取和寫入的排隊goroutine連結清單

c. 鎖

任何操作前都需要獲得鎖, 當寫滿或者讀空的時候,就将目前goroutine加入到recvq或者sendq中, 并出讓cpu(gopark)。

6、簡單描述下golang的gc算法

golang現行的gc算法是三色标記法,三色指的是在gc過程中會把對象标記給黑,灰,白三色。

三色标記法是對标記-清除算法的優化,目的是減少stop the world的時間。

7、recover能處理所有的異常嗎

8、select可以用于什麼,常用語gorotine的完美退出

golang 的 select 就是監聽 IO 操作,當 IO 操作發生時,觸發相應的動作
每個case語句裡必須是一個IO操作,确切的說,應該是一個面向channel的IO操作
           

9、context包的用途

Context通常被譯作上下文,它是一個比較抽象的概念,其本質,是【上下上下】存在上下層的傳遞,上會把内容傳遞給下。在Go語言中,程式單元也就指的是Goroutine

10、client如何實作長連接配接

11、主協程如何等其餘協程完再操作

使用channel進行通信,context,select
           

12、slice,len,cap,共享,擴容

append函數,因為slice底層資料結構是,由數組、len、cap組成,是以,在使用append擴容時,會檢視數組後面有沒有連續記憶體快,有就在後面添加,沒有就重新生成一個大的素組
           

13、map如何順序讀取

map不能順序讀取,是因為他是無序的,想要有序讀取,首先的解決的問題就是,把key變為有序,是以可以把key放入切片,對切片進行排序,周遊切片,通過key取值。
           

14、實作set

type inter interface{}
type Set struct {
    m map[inter]bool
    sync.RWMutex
}
 
func New() *Set {
    return &Set{
    m: map[inter]bool{},
    }
}
func (s *Set) Add(item inter) {
    s.Lock()
    defer s.Unlock()
    s.m[item] = true
}      

15、實作消息隊列(多生産者,多消費者)

使用切片加鎖可以實作
           

16、大檔案排序

歸并排序,分而治之,拆分為小檔案,在排序
           

17、基本排序,哪些是穩定的

18、http能不能一次連接配接多次請求,不等後端傳回

http本質上市使用socket連接配接,是以發送請求,接寫入tcp緩沖,是可以多次進行的,這也是http是無狀态的原因
           

19、tcp與udp差別,udp優點,适用場景

tcp傳輸的是資料流,而udp是資料包,tcp會進過三次握手,udp不需要           

20、孤兒程序,僵屍程序

21、Slice與數組差別,Slice底層結構

22、項目裡的微信支付這塊,在支付完微信通知這裡,收到兩次微信相同的支付通知,怎麼防止重複消費(類似接口的幂等性),說了借助Redis或者資料庫的事務

23、Go的反射包怎麼找到對應的方法(這裡忘記怎麼問的,直接說不會,隻用了DeepEqual,簡單講了DeepEqual)

24、Mysql的索引有幾種,時間複雜度

25、Go的channel(有緩沖和無緩沖)

26、退出程式時怎麼防止channel沒有消費完,

27、生産者消費者模式,手寫代碼,channel緩沖長度怎麼決定,怎麼控制上遊生産速度過快,這裡沒說出解決方案,隻是簡單說了channel長度可以與上下遊的速度比例成線性關系

29、手寫循環隊列,寫的循環隊列是不是線程安全,不是,怎麼保證線程安全,加鎖,效率有點低啊,Go推崇原子操作和channel

30、TimeWait和CloseWait原因

31、看過啥源碼,nsq(Go的消息中間件)waitgroup包等

32、sync.Pool用過嗎,為什麼使用,對象池,避免頻繁配置設定對象(GC有關),那裡面的對象是固定的嗎?

33、微服務,服務治理是怎麼樣的 

34、證明二叉樹的葉子節點跟度數為2的節點的關系

35、智能指針

36、字元串解析為數字(考慮浮點型)

37、單點登入,tcp粘包

38、手寫洗牌

39、處理粘包斷包實作

40、goroutine排程用了什麼系統調用?

41、程序虛拟空間分布,全局變量放哪裡?答上來了,作業系統就不問了

42、有沒有網絡程式設計,有,怎麼看連接配接狀态?netstat,有哪些?ESTABLISHED,LISTEN等等,有異常情況嗎?TIME_WAIT很多,為什麼?大量短連結

43、幾種基本排序算法說一下,問了堆的時間複雜度,穩定性,為什麼不穩定

44、 topk問題,海量資料topk,最長連續字串和,這裡我說的解決方案沒用dp(對dp不熟)

45、項目我說隻有一台機子,是以用的單機部署,面試官說單機也可以部署多個,有什麼方法嗎?我說docker,問docker有哪些網絡,不熟,dockerfile關鍵字,隻答幾個。順便扯了下nginx轉發。

46、資料庫隔離級别,送出讀會造成什麼

47、 goroutine洩漏有沒有處理,設定timeout,select加定時器

48、排序算法以及時間複雜度

50、go的線程,給他講了跟goroutine排程

56、io模型,同步阻塞,同步非阻塞,異步

57、redis分布式,如何減少同步延遲

58、平時怎麼學習?

59、看過google四篇分布式論文嗎?

60、cap理論,舉例

61、LRU算法,LFU

62、講講怎麼了解網絡程式設計

63、go使用踩過什麼坑(for range,資料庫連接配接defer close)

64、go優缺點

65、go的值傳遞和引用

67、m個n大小的有序數組求并集,一開始是2路歸并,求時間複雜度,後來在面試官提醒直接m路歸并,求時間複雜度

68、static關鍵字,還有其他關鍵字嗎

69、hash表設計,線程安全?

70、 線程自己獨享什麼

71、網絡程式設計過程

72、select、epoll

73、排行榜怎麼實作

74、go的鎖如何實作,用了什麼cpu指令

75、go的runtime如何實作

76、看過sql的連接配接池實作嗎

77、ctx包了解嗎?有什麼用?

78、go什麼情況下會發生記憶體洩漏?

79、怎麼實作協程完美退出?

80、簡單dp題,n*n矩陣從左上角到右下角有多少種走法(隻限往下和往右走)

81、用channel實作定時器?(實際上是兩個協程同步)

82、go為什麼高并發好?go的排程模型

83、作業系統記憶體管理?程序通訊,為什麼共享存儲區效率最高

84、實作一個hashmap,解決hash沖突的方法,解決hash傾斜的方法

85、怎麼了解go的interface

86、100億個數選top5,小根堆

87、數組和為n的數組對

88、最大連續子數組和

89、跳躍表,為什麼使用跳躍表而不使用紅黑樹

90、tcp怎麼找到哪個套接字

91、ipc方式,共享存儲區原理

92、程序虛拟空間布局

93、程序狀态轉換

94、線程的棧在哪裡配置設定

95、多個線程讀,一個線程寫一個int32會不會有問題,int64呢

96、判斷二叉樹是否為滿二叉樹

  • 作者:踏雪無痕
  • 出處:http://www.cnblogs.com/chenpingzhao/
  • 本文版權歸作者和部落格園共有,如需轉載,請聯系  pingzhao1990#163.com