3dwoo大學簡體電腦書店
Go語言底層原理剖析
( 簡體 字)
作者:鄭建勛類別:1. -> 程式設計 -> Go語言
出版社:電子工業出版社Go語言底層原理剖析 3dWoo書號: 55035
詢問書籍請說出此書號!
缺書
NT售價: 495
出版日:8/1/2021
頁數:396
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787121416620 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
第1章 深入Go語言編譯器 1
1.1 為什么要了解Go語言編譯器 1
1.2 Go語言編譯器的階段 1
1.3 詞法解析 3
1.4 語法解析 4
1.5 抽象語法樹構建 6
1.6 類型檢查 8
1.7 變量捕獲 8
1.8 函數內聯 9
1.9 逃逸分析 12
1.10 閉包重寫 14
1.11 遍歷函數 15
1.12 SSA生成 15
1.13 機器碼生成——匯編器 18
1.14 機器碼生成——鏈接 20
1.15 ELF文件解析 23
1.16 總結 26
第2章 浮點數設計原理與使用方法 27
2.1 浮點數陷阱 27
2.2 定點數與浮點數 27
2.3 IEEE-754浮點數標準 28
2.3.1 小數部分計算 29
2.3.2 顯示浮點數格式 30
2.4 最佳實踐:判斷浮點數為整數 31
2.5 常規數與非常規數 33
2.6 NaN與Inf 33
2.7 浮點數精度 34
2.8 浮點數與格式化打印 36
2.9 浮點數計算與精度損失 37
2.10 多精度浮點數與math/big庫 38
2.11 總結 41
第3章 類型推斷全解析 42
3.1 類型推斷的優勢 42
3.2 Go語言中類型推斷的特性 43
3.3 類型推斷原理 44
3.3.1 詞法解析與語法分析階段 44
3.3.2 抽象語法樹生成與類型檢查 46
3.4 總結 48
第4章 常量與隱式類型轉換 49
4.1 常量聲明與生存周期 49
4.2 常量類型轉換 50
4.2.1 隱式整數轉換 50
4.2.2 隱式浮點數轉換 51
4.2.3 常量運算中的隱式轉換 51
4.2.4 常量與變量之間的轉換 51
4.2.5 自定義類型的轉換 52
4.3 常量與隱式類型轉換原理 53
4.4 總結 55
第5章 字符串本質與實現 56
5.1 字符串的本質 56
5.2 符文類型 57
5.3 字符串工具函數 58
5.4 字符串底層原理 59
5.4.1 字符串解析 59
5.4.2 字符串拼接 61
5.4.3 運行時字符拼接 62
5.4.4 字符串與字節數組的轉換 64
5.5 總結 66
第6章 數組 67
6.1 數組的聲明方式 67
6.2 數組值復制 68
6.3 數組底層原理 68
6.3.1 編譯時數組解析 68
6.3.2 數組字面量初始化原理 69
6.3.3 數組字面量編譯時內存優化 70
6.3.4 數組索引與訪問越界原理 70
6.4 總結 73
第7章 切片使用方法與底層原理 74
7.1 切片使用方法 74
7.1.1 切片的結構 74
7.1.2 切片的初始化 75
7.1.3 切片的截取 75
7.1.4 切片值復制與數據引用 76
7.1.5 切片收縮與擴容 77
7.2 切片底層原理 78
7.2.1 字面量初始化 78
7.2.2 make初始化 79
7.2.3 切片擴容原理 80
7.2.4 切片截取原理 82
7.2.5 切片的完整復制 83
7.3 總結 84
第8章 哈希表與Go實現機制 85
8.1 哈希碰撞與解決方法 85
8.2 map基本操作 87
8.2.1 map聲明與初始化 87
8.2.2 map訪問 87
8.2.3 map賦值 88
8.2.4 key的比較性 88
8.2.5 map并發沖突 89
8.3 哈希表底層結構 89
8.4 哈希表原理圖解 91
8.5 深入哈希表原理 94
8.5.1 make初始化原理 94
8.5.2 字面量初始化原理 96
8.5.3 map訪問原理 97
8.5.4 map賦值操作原理 99
8.5.5 map重建原理 102
8.5.6 map刪除原理 103
8.6 總結 104
第9章 函數與棧 105
9.1 函數基本使用方式 105
9.2 函數閉包與陷阱 106
9.3 函數棧 107
9.4 Go語言棧幀結構 108
9.5 Go語言函數調用鏈結構與特性 110
9.6 堆棧信息 111
9.7 棧擴容與棧轉移原理 113
9.8 棧調試 118
9.9 總結 120
第10章 defer延遲調用 121
10.1 使用的defer的優勢 122
10.1.1 資源釋放 122
10.1.2 異常捕獲 123
10.2 defer特性 125
10.2.1 延遲執行 125
10.2.2 參數預計算 126
10.2.3 defer多次執行與LIFO執行順序 127
10.3 defer返回值陷阱 127
10.4 defer底層原理 129
10.4.1 defer演進 129
10.4.2 堆分配 130
10.4.3 defer遍歷調用 134
10.4.4 Go 1.13棧分配優化 137
10.4.5 Go 1.14內聯優化 138
10.5 總結 140
第11章 異常與異常捕獲 141
11.1 panic函數使用方法 141
11.2 異常捕獲與recover 142
11.3 panic與recover嵌套 144
11.4 panic函數底層原理 145
11.5 recover底層原理 149
11.6 總結 152
第12章 接口與程序設計模式 154
12.1 接口的用途 154
12.2 Go語言中的接口 155
12.3 Go接口實踐 156
12.4 Go接口的使用方法 158
12.4.1 Go接口的聲明與定義 158
12.4.2 接口實現 159
12.4.3 接口動態類型 160
12.4.4 接口的動態調用 161
12.4.5 多接口 162
12.4.6 接口的組合 162
12.4.7 接口類型斷言 163
12.4.8 空接口 164
12.4.9 接口的比較性 166
12.5 接口底層原理 166
12.5.1 接口實現算法 166
12.5.2 接口組成 168
12.5.3 接口內存逃逸分析 171
12.5.4 接口動態調用過程 173
12.5.5 接口動態調用過程的效率評價 177
12.5.6 接口轉換 182
12.5.7 空接口組成 184
12.5.8 空接口switch 187
12.5.9 接口的陷阱 189
12.6 總結 191
第13章 反射高級編程 192
13.1 為什么需要反射 193
13.2 反射的基本使用方法 195
13.2.1 反射的兩種基本類型 195
13.2.2 反射轉換為接口 196
13.2.3 Elem()間接訪問 197
13.2.4 修改反射的值 199
13.2.5 結構體與反射 200
13.2.6 遍歷結構體字段 200
13.2.7 修改結構體字段 201
13.2.8 嵌套結構體的賦值 202
13.2.9 結構體方法與動態調用 203
13.2.10 反射在運行時創建結構體 205
13.2.11 函數與反射 206
13.2.12 反射與其他類型 206
13.3 反射底層原理 207
13.3.1 reflect.Type詳解 207
13.3.2 Interface方法原理 209
13.3.3 Int方法原理 211
13.3.4 Elem方法釋疑 211
13.3.5 動態調用剖析 213
13.4 總結 216
第14章 協程初探 217
14.1 進程與線程 217
14.2 線程上下文切換 219
14.3 線程與協程 220
14.3.1 調度方式 220
14.3.2 上下文切換的速度 220
14.3.3 調度策略 221
14.3.4 棧的大小 221
14.4 并發與并行 221
14.5 簡單協程入門 222
14.6 main協程與子協程 223
14.7 GMP模型 225
14.8 總結 226
第15章 深入協程設計與調度原理 227
15.1 協程的生命周期與狀態轉移 227
15.2 特殊協程g0與協程切換 228
15.3 線程本地存儲與線程綁定 230
15.4 調度循環 231
15.5 調度策略 232
15.5.1 獲取本地運行隊列 234
15.5.2 獲取全局運行隊列 235
15.5.3 獲取準備就緒的網絡協程 236
15.5.4 協程竊取 237
15.6 調度時機 238
15.6.1 主動調度 238
15.6.2 被動調度 239
15.6.3 搶占調度 241
15.6.4 執行時間過長的搶占調度 241
15.7 總結 247

第16章 通道與協程間通信 248
16.1 CSP并發編程 248
16.2 通道基本使用方式 249
16.2.1 通道聲明與初始化 249
16.2.2 channel寫入數據 250
16.2.3 通道讀取數據 250
16.2.4 通道關閉 250
16.2.5 通道作為參數和返回值 252
16.2.6 單方向通道 253
16.2.7 通道最佳實踐 254
16.3 select多路復用 258
16.3.1 select隨機選擇機制 258
16.3.2 select堵塞與控制 259
16.3.3 循環select 260
16.3.4 select 與nil 261
16.4 通道底層原理 261
16.4.1 通道結構與環形隊列 261
16.4.2 通道初始化 263
16.4.3 通道寫入原理 263
16.4.4 通道讀取原理 265
16.5 select底層原理 267
16.5.1 select一輪循環 269
16.5.2 select二輪循環 270
16.6 總結 271
第17章 并發控制 272
17.1 context 272
17.1.1 為什么需要Context 272
17.1.2 Context使用方式 274
17.2 context原理 277
17.3 數據爭用檢查 280
17.3.1 什么是數據爭用 280
17.3.2 數據爭用檢查詳解 282
17.3.3 race工具原理 282
17.4 鎖 286
17.4.1 原子鎖 287
17.4.2 互斥鎖 289
17.4.3 互斥鎖實現原理 290
17.4.4 互斥鎖的釋放 294
17.4.5 讀寫鎖 295
17.4.6 讀寫鎖原理 296
17.5 總結 298
第18章 內存分配管理 299
18.1 Go語言內存分配全局視野 299
18.1.1 span與元素 299
18.1.2 三級對象管理 300
18.1.3 四級內存塊管理 301
18.2 對象分配 302
18.2.1 微小對象 302
18.2.2 mcache緩存位圖 304
18.2.3 mcentral遍歷span 305
18.2.4 mheap緩存查找 307
18.2.5 mheap基數樹查找 307
18.2.6 操作系統內存申請 311
18.2.7 小對象分配 311
18.2.8 大對象分配 312
18.3 總結 312
第19章 垃圾回收初探 313
19.1 為什么需要垃圾回收 314
19.1.1 減少錯誤和復雜性 314
19.1.2 解耦 314
19.2 垃圾回收的5種經典算法 315
19.2.1 標記-清掃 315
19.2.2 標記-壓縮 316
19.2.3 半空間復制 316
19.2.4 引用計數 317
19.2.5 分代GC 318
19.3 Go語言中的垃圾回收 318
19.3.1 為什么不選擇壓縮GC? 319
19.3.2 為什么不選擇分代GC? 319
19.4 Go垃圾回收演進 319
19.5 總結 321
第20章 深入垃圾回收全流程 322
20.1 垃圾回收循環 322
20.2 標記準備階段 323
20.2.1 計算標記協程的數量 323
20.2.2 切換到后臺標記協程 325
20.3 并發標記階段 325
20.3.1 根對象掃描 327
20.3.2 全局變量掃描 328
20.3.3 finalizer 330
20.3.4 棧掃描 331
20.3.5 棧對象 332
20.3.6 掃描灰色對象 333
20.4 標記終止階段 336
20.5 輔助標記 339
20.6 屏障技術 341
20.7 垃圾清掃 347
20.7.1 懶清掃邏輯 348
20.7.2 輔助清掃 349
20.8 系統駐留內存清除 350
20.9 實戰:垃圾回收產生的性能問題 352
20.10 總結 354
第21章 調試利器:特征分析與事件追蹤 355
21.1 pprof的使用方式 355
21.1.1 堆內存特征分析 357
21.1.2 pprof可視化結果說明 360
21.1.3 pprof協程棧分析 361
21.1.4 base基準分析 362
21.1.5 mutex堵塞分析 363
21.1.6 CPU占用分析 363
21.2 火焰圖分析 365
21.3 trace事件追蹤 366
21.3.1 trace工具的用法與說明 366
21.3.2 trace 分析場景 369
21.4 pprof底層原理 370
21.4.1 堆內存樣本 370
21.4.2 協程棧樣本收集原理 372
21.4.3 CPU樣本收集原理 372
21.4.4 pprof分析原理 375
21.5 trace底層原理 377
21.6 總結 379
Go語言是一門年輕、簡捷,但是強大、高效、充滿潛力的服務器語言。本書使用淺顯易懂的語言與大量圖片深入介紹了Go語言編譯時、類型系統、語法特性、函數調用規范、并發編程、內存管理與垃圾回收、運行狀態監控等模塊的使用方法和底層原理,并舉例說明了構建大型軟件工程需要遵循的設計規則,讓作者系統并完整掌握Go語言隱藏在使用方法背后的底層細節。 本書適合有一定工作經驗的開發工程師進一步提升自己,以便更好地開發軟件、系統架構,并進行工作面試。也可以作為高等院校計算機專業師生學習編程語言設計原理的參考教材。
Go語言雖然是一門非常年輕的語言(2009年正式開源),但是卻以不可思議的速度在成長。
頂級大公司(谷歌)的支持、頂尖的設計者(羅勃·派克、肯·湯普遜)和豪華的開發團隊、殺手級的項目(Kubernetes)、開放活躍的社區以及數以百萬計的開發者都揭示了Go語言的巨大潛力。在國內,Go語言良好的發展趨勢可以從招聘網站中數量龐大的崗位需求以及每天發表在各種媒體上的種類繁多的相關文章中得到印證。
在可預見的未來,相信Go語言還將延續強勁的發展勢頭。為了把握和適應時代的需求,開發者需要在短時間內掌握Go這門語言。雖然高級語言足夠抽象,在大部分情況下掌握了基本的語法就可以創建龐大和復雜的項目,但是遵守什么規則才能寫出正確、優雅、容易維護的代碼呢?當程序的執行結果不符合預期時是否有足夠多的手段去調試?很顯然,會使用和能用好有本質的區別,充分的經驗、合理的架構、遵守軟件設計規范、使用經典的設計模式、規避常見的錯誤陷阱、強制性工具檢查都能夠幫助開發者寫出更好的程序。然而很多時候我們并不滿足于此,還希望探究語言背后的原理。
Go語言的編譯器、運行時本身就是用Go語言寫出的最復雜精巧的程序,探究語言設計、語法特性本身就是學習程序設計與架構、數據結構與算法等知識的絕佳途徑。學習底層原理能夠更好地了解Go語言的語法,做出合理的性能優化,設計科學的程序架構,監控程序的運行狀態,排查復雜的程序異常問題,開發出檢查協程泄露、語法等問題的高級工具,理解Go語言的局限性從而在不同場景下做出合理抉擇。學習Go語言底層原理不僅能提升自己的專業技能和薪資水平,這種學習本身就是一種樂趣,而這種樂趣恰恰是很多自上而下學習編程語言的開發者不能體會的。
目前市面上鮮有系統介紹Go語言底層實現原理的書籍,為了彌補這個缺陷,筆者寫作本書,系統性地介紹Go語言在編譯時、運行時以及語法特性等層面的底層原理和其更好的使用方法。本書分為6部分:
第1部分介紹Go語言的基礎——編譯時及類型系統。包括浮點數、切片、哈希表等類型以及類型轉換的原理。
第2部分介紹程序運行重要的組成部分——函數與棧。包括棧幀布局、棧擴容、棧調試的原理,并介紹了延遲調用、異常與異常捕獲原理。
第3部分介紹Go語言程序設計的關鍵——接口。包括如何正確合理地使用接口構建程序、接口的實現原理和可能遇到的問題,并探討了站在接口之上的反射原理。
第4部分介紹Go語言并發的核心——協程與通道。詳細論述了協程的本質以及運行時調度器的調度時機與策略。介紹了通過通信來共享內存的通道本質以及通道的多路復用原理,并探討了并發控制、數據爭用問題的解決辦法及鎖的本質。
第5部分介紹Go語言運行時最復雜的模塊——內存管理與垃圾回收。詳細論述了Go語言中實現內存管理方法及垃圾回收的詳細步驟。
第6部分介紹Go語言可視化工具——pprof與trace。詳細論述了通過工具排查問題、觀察系統運行狀態的方法與實現原理。
為了準確地論述每一個話題,筆者參閱了市面上能夠找到的文章、提案并詳細參考了相應的源代碼。從某種意義上來講,這是一本站在巨人的肩膀上的著作。學習原理是為了更好地使用,筆者在本書中不會粘貼大段的源碼,而是將其充分整理并結合了作者的思考后用圖和例子的形式來講解。相信當讀者閱讀完本書后能夠建立一整套底層原理模型并會對程序有不一樣的體會,就像清晰地看到了Go程序中的每一根血管和每一個細胞。
本書各章參考資料可通過微信掃描封底二維碼獲取。

鄭建勛
2021年5月
pagetop