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的區別是什么
make是用來初始化map,slice,以及channel的, 它返回的不是指針,而是對象本身。另外,make出來的map,slice,channel都是可以直接使用的。
5、golang 的channel是怎么實現的
a. 指向內容的環形緩存區,及其相關游標
b. 讀取和寫入的排隊goroutine鏈表
c. 鎖
任何操作前都需要獲得鎖, 當寫滿或者讀空的時候,就將當前goroutine加入到recvq或者sendq中, 並出讓cpu(gopark)。
6、簡單描述下golang的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、判斷二叉樹是否為滿二叉樹
