【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、判斷二叉樹是否為滿二叉樹

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM