Go 語言底層原理剖析

鄭建勳

  • 出版商: 電子工業
  • 出版日期: 2021-08-01
  • 售價: $594
  • 貴賓價: 9.5$564
  • 語言: 簡體中文
  • 頁數: 396
  • 裝訂: 平裝
  • ISBN: 712141662X
  • ISBN-13: 9787121416620
  • 相關分類: Go 程式語言
  • 銷售排行: 🥉 2022/1 簡體中文書 銷售排行 第 3 名

    立即出貨 (庫存 < 4)

買這商品的人也買了...

商品描述

Go語言是一門年輕、簡捷,但是強大、高效、充滿潛力的服務器語言。
本書使用淺顯易懂的語言與大量圖片深入介紹了Go語言編譯時、類型系統、語法特性、函數調用規範、
並發編程、內存管理與垃圾回收、運行狀態監控等模塊的使用方法和底層原理,
並舉例說明了構建大型軟件工程需要遵循的設計規則,
讓作者係統並完整掌握Go語言隱藏在使用方法背後的底層細節。
本書適合有一定工作經驗的開發工程師進一步提升自己,
以便更好地開發軟件、系統架構,並進行工作面試。
也可以作為高等院校計算機專業師生學習編程語言設計原理的參考教材

作者簡介

鄭建勳

曾任海航集團區塊鏈工程師,現任51CTO集團Go語言以及區塊鏈高級講師。
擁有豐富的教育經驗,教授有體系的Go語言課程,學生上萬。
全棧極客,精通Go語言。
現任KVB集團高級技術專家,負責外匯交易分佈式微服務集群的架構與開發,
擁有豐富的高並發、分佈式、微服務集群的實戰經驗。

目錄大綱

第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