內容簡介
Go語言是一門既年輕、簡捷,又強大、高效、充滿潛力的伺服器語言。《Go程式設計師面試筆試寶典》使用淺顯易懂的語言與大量流程圖,深入介紹了Go語言。全書分為三大部分:第1部分(1~5章)為Go語言基礎。介紹了Go 語言中最基礎、最常見的逃逸分析、defer 延遲語句、切片、數組、散列表、通道和接口。第2部分(6~11章)為Go語言類庫。介紹了Go語言自身的類庫,如unsafe、context、錯誤、計時器、反射和sync包。第3部分(12~14章)為Go語言高級特性。介紹了調度、記憶體分配、GC,從原理到源碼分析,逐漸深入。這三大部分是runtime 中最重要、最核心的內容,理解了這三者的原理,才算是對Go語言有了一個比較深入的理解和掌握。
《Go程式設計師面試筆試寶典》是一本計算機相關專業畢業生面試筆試求職參考書,同時也適合有一定工作經驗的開發工程師進一步提升自身水平。
圖書目錄
前言
第1部分 語 言 基 礎
第1章 逃逸分析/2
1.1 逃逸分析是什麼/2
1.2 逃逸分析有什麼作用/3
1.3 逃逸分析是怎么完成的/3
1.4 如何確定是否發生逃逸/4
1.5 Go與C/C++中的堆和棧是同一個概念嗎/5
第2章 延遲語句/6
2.1 延遲語句是什麼/6
2.2 延遲語句的執行順序是什麼/7
2.3 如何拆解延遲語句/9
2.4 如何確定延遲語句的參數/10
2.5 閉包是什麼/11
2.6 延遲語句如何配合恢復語句/11
2.7 defer鏈如何被遍歷執行/13
2.8 為什麼無法從父goroutine恢復子goroutine的panic/18
第3章 數據容器/20
3.1 數組與切片/20
3.1.1 數組和切片有何異同/20
3.1.2 切片如何被截取/20
3.1.3 切片的容量是怎樣增長的/23
3.1.4 切片作為函式參數會被改變嗎/27
3.1.5 內建函式make和new的區別是什麼/28
3.2 散列表map/29
3.2.1 map 是什麼/29
3.2.2 map 的底層實現原理是什麼/30
3.2.3 map 中的 key 為什麼是無序的/50
3.2.4 map 是執行緒安全的嗎/50
3.2.5 float類型可以作為map的key嗎/50
3.2.6 map 如何實現兩種 get 操作/52
3.2.7 如何比較兩個 map 是否相等/53
3.2.8 可以對 map 的元素取地址嗎/54
3.2.9 可以邊遍歷邊刪除嗎/54
第4章 通道/55
4.1 CSP是什麼/55
4.2 通道有哪些套用/56
4.3 通道的底結構/57
4.3.1 數據結構/57
4.3.2 創建過程/58
4.3.3 接收過程/60
4.3.4 傳送過程/67
4.3.5 收發數據的本質/72
4.4 通道的關閉過程發生了什麼/74
4.5 從一個關閉的通道里仍然能讀出數據嗎/75
4.6 如何優雅地關閉通道/76
4.7 關於通道的happens-before有哪些/79
4.8 通道在什麼情況下會引起資源泄漏/81
4.9 通道操作的情況總結/81
第5章 接口/82
5.1 Go接口與C++接口有何異同/82
5.2 Go語言與“鴨子類型”的關係/82
5.3 iface和eface的區別是什麼/84
5.4 值接收者和指針接收者的區別/86
5.4.1 方法/86
5.4.2 值接收者和指針接收者/87
5.4.3 兩者分別在何時使用/89
5.5 如何用interface實現多態/89
5.6 接口的動態類型和動態值是什麼/91
5.7 接口轉換的原理是什麼/93
5.8 類型轉換和斷言的區別是什麼/96
5.9 如何讓編譯器自動檢測類型是否實現了接口/101
第2部分 語 言 類 庫
第6章 unsafe/104
6.1 如何利用unsafe包修改私有成員/104
6.2 如何利用unsafe獲取slice和map的長度/105
6.3 如何實現字元串和byte切片的零複製轉換/106
第7章 context/108
7.1 context是什麼/108
7.2 context有什麼作用/108
7.3 如何使用context/109
7.3.1 傳遞共享的數據/109
7.3.2 定時取消/111
7.3.3 防止 goroutine 泄漏/111
7.4 context底層原理是什麼/112
7.4.1 接口/113
7.4.2 結構體/114
第8章 錯誤/124
8.1 接口error是什麼/124
8.2 接口error有什麼問題/125
8.3 如何理解關於error的三句諺語/126
8.3.1 視錯誤為值/126
8.3.2 檢查並優雅地處理錯誤/128
8.3.3 只處理錯誤一次/130
8.4 錯誤處理的改進/131
第9章 計時器/133
9.1 Timer底層數據結構為什麼用四叉堆而非二叉堆/133
9.2 Timer曾做過哪些重大的改進/134
9.3 定時器的使用場景有哪些/134
9.4 Timer/Ticker 的計時功能有多準確/134
9.5 定時器的實現還有其他哪些方式/137
第10章 反射/140
10.1 反射是什麼/140
10.2 什麼情況下需要使用反射/140
10.3 Go語言如何實現反射/140
10.3.1 types 和 interface/141
10.3.2 反射的基本函式/144
10.3.3 反射的三大定律/149
10.4 如何比較兩個對象是否完全相同/149
10.5 如何利用反射實現深度拷貝/151
第11章 同步模式/154
11.1 等待組 sync.WaitGroup 的原理是什麼/154
11.2 快取池 sync.Pool/157
11.2.1 如何使用sync.Pool/157
11.2.2 sync.Pool 是如何實現的/162
11.3 並發安全散列表 sync.Map/174
11.3.1 如何使用 sync.Map/175
11.3.2 sync.Map 底層如何實現/176
第3部分 高 級 特 性
第12章 調度機制/184
12.1 goroutine 和執行緒有什麼區別/184
12.2 Go sheduler 是什麼/184
12.3 goroutine 的調度時機有哪些/186
12.4 M:N模型是什麼/187
12.5 工作竊取是什麼/187
12.6 GPM底層數據結構是怎樣的/188
12.7 scheduler 的初始化過程是怎樣的/193
12.8 主 goroutine 如何被創建/207
12.9 g0棧和用戶棧如何被切換/212
12.10 Go schedule循環如何啟動/217
12.11 goroutine如何退出/221
12.12 schedule循環如何運轉/226
12.13 M如何找工作/227
12.14 系統監控sysmon後台監控執行緒做了什麼/237
12.14.1 搶占進行系統調用的P/240
12.14.2 搶占長時間運行的P/243
12.15 異步搶占的原理是什麼/247
第13章 記憶體分配機制/252
13.1 管理記憶體的動機是什麼,通常涉及哪些組件/252
13.1.1 記憶體管理的動機/252
13.1.2 記憶體管理運行時的組件/252
13.1.3 記憶體的使用狀態/253
13.2 Go語言中的堆和棧概念與傳統意義上的堆和棧有什麼區別/255
13.3 對象分配器是如何實現的/255
13.3.1 分配的基本策略/256
13.3.2 對象分配器的基本組件和層級/256
13.3.3 對象分配的產生條件和入口/259
13.3.4 大對象分配/261
13.3.5 小對象分配/262
13.3.6 微對象分配/264
13.4 頁分配器是如何實現的/265
13.4.1 頁的分配/265
13.4.2 跨度的分配/266
13.4.3 非託管對象與定長分配器/267
13.5 與記憶體管理相關的運行時組件還有哪些/269
13.5.1 執行棧管理/269
13.5.2 垃圾回收器和拾荒器/271
13.6 衡量記憶體消耗的指標有哪些/272
13.7 運行時記憶體管理的演變歷程/278
13.7.1 演變過程/278
13.7.2 存在的問題/279
第14章 垃圾回收機制/280
14.1 垃圾回收的認識/280
14.1.1 垃圾回收是什麼,有什麼作用/280
14.1.2 根對象到底是什麼/280
14.1.3 常見的垃圾回收的實現方式有哪些,Go語言使用的是什麼/281
14.1.4 三色標記法是什麼/281
14.1.5 STW是什麼意思/282
14.1.6 如何觀察 Go 語言的垃圾回收現象/283
14.1.7 有了垃圾回收,為什麼還會發生記憶體泄漏/286
14.1.8 並發標記清除法的難點是什麼/288
14.1.9 什麼是寫屏障、混合寫屏障,如何實現/289
14.2 垃圾回收機制的實現細節/291
14.2.1 Go語言中進行垃圾回收的流程是什麼/291
14.2.2 觸發垃圾回收的時機是什麼/292
14.2.3 如果記憶體分配速度超過了標記清除的速度怎么辦/294
14.3 垃圾回收的最佳化問題/295
14.3.1 垃圾回收關注的指標有哪些/295
14.3.2 Go 的垃圾回收過程如何調優/295
14.3.3 Go的垃圾回收有哪些相關的API,其作用分別是什麼/305
14.4 歷史及演進/305
14.4.1 Go 歷史各個版本在垃圾回收方面的改進/305
14.4.2 Go在演化過程中還存在哪些其他設計,為什麼沒有被採用/307
14.4.3 Go語言中垃圾回收還存在哪些問題/307
結束語/310