前言 iii
第 1章 調試源代碼 1
1.1 Go語言源代碼 1
1.2 編譯源代碼 2
1.3 中間代碼 3
1.4 小結 4
第 2章 編譯原理 5
2.1 編譯過程 5
2.1.1 預備知識 5
2.1.2 編譯四階段 7
2.1.3 編譯器入口 10
2.1.4 小結 11
2.1.5 延伸閱讀 12
2.2 詞法分析和語法分析 12
2.2.1 詞法分析 12
2.2.2 語法分析 17
2.2.3 小結 26
2.2.4 延伸閱讀 26
2.3 類型檢查 26
2.3.1 強弱類型 26
2.3.2 靜態(tài)類型與動態(tài)類型 27
2.3.3 執(zhí)行過程 28
2.3.4 小結 34
2.4 中間代碼生成 34
2.4.1 概述 34
2.4.2 配置初始化 35
2.4.3 遍歷和替換 37
2.4.4 SSA生成 40
2.4.5 小結 44
2.5 機器碼生成 44
2.5.1 指令集架構 44
2.5.2 機器碼生成 45
2.5.3 小結 49
2.5.4 延伸閱讀 50
第3章 數據結構 51
3.1 數組 51
3.1.1 概述 51
3.1.2 初始化 52
3.1.3 訪問和賦值 55
3.1.4 小結 57
3.1.5 延伸閱讀 58
3.2 切片 58
3.2.1 數據結構 58
3.2.2 初始化 59
3.2.3 訪問元素 63
3.2.4 追加和擴容 64
3.2.5 復制切片 67
3.2.6 小結 68
3.2.7 延伸閱讀 68
3.3 哈希表 68
3.3.1 設計原理 69
3.3.2 數據結構 72
3.3.3 初始化 74
3.3.4 讀寫操作 77
3.3.5 小結 88
3.3.6 延伸閱讀 88
3.4 字符串 88
3.4.1 數據結構 89
3.4.2 解析過程 89
3.4.3 拼接 91
3.4.4 類型轉換 93
3.4.5 小結 95
3.4.6 延伸閱讀 95
第4章 語言特性 96
4.1 函數調用 96
4.1.1 調用慣例 96
4.1.2 參數傳遞 101
4.1.3 小結 104
4.1.4 延伸閱讀 104
4.2 接口 105
4.2.1 概述 105
4.2.2 數據結構 111
4.2.3 類型轉換 113
4.2.4 類型斷言 116
4.2.5 動態(tài)派發(fā) 118
4.2.6 小結 122
4.2.7 延伸閱讀 122
4.3 反射 123
4.3.1 三大法則 124
4.3.2 類型和值 127
4.3.3 更新變量 129
4.3.4 實現協(xié)議 130
4.3.5 方法調用 132
4.3.6 小結 135
4.3.7 延伸閱讀 135
第5章 常用關鍵字 136
5.1 for和range 136
5.1.1 現象 137
5.1.2 經典循環(huán) 140
5.1.3 范圍循環(huán) 141
5.1.4 小結 147
5.2 select 148
5.2.1 現象 148
5.2.2 數據結構 151
5.2.3 實現原理 151
5.2.4 小結 160
5.2.5 延伸閱讀 161
5.3 defer 161
5.3.1 現象 161
5.3.2 數據結構 163
5.3.3 執(zhí)行機制 164
5.3.4 堆中分配 164
5.3.5 棧上分配 168
5.3.6 開放編碼 169
5.3.7 小結 173
5.3.8 延伸閱讀 174
5.4 panic和recover 174
5.4.1 現象 175
5.4.2 數據結構 177
5.4.3 程序崩潰 178
5.4.4 崩潰恢復 179
5.4.5 小結 181
5.4.6 延伸閱讀 181
5.5 make和new 181
5.5.1 make 182
5.5.2 new 183
5.5.3 小結 184
第6章 并發(fā)編程 185
6.1 上下文 185
6.1.1 設計原理 186
6.1.2 默認上下文 187
6.1.3 取消信號 188
6.1.4 傳值方法 192
6.1.5 小結 192
6.1.6 延伸閱讀 192
6.2 同步原語與鎖 193
6.2.1 基本原語 193
6.2.2 擴展原語 209
6.2.3 小結 218
6.2.4 延伸閱讀 218
6.3 計時器 219
6.3.1 設計原理 219
6.3.2 數據結構 222
6.3.3 狀態(tài)機 223
6.3.4 觸發(fā)計時器 229
6.3.5 小結 231
6.3.6 延伸閱讀 232
6.3.7 歷史變更 232
6.4 Channel 232
6.4.1 設計原理 232
6.4.2 數據結構 234
6.4.3 創(chuàng)建Channel 235
6.4.4 發(fā)送數據 237
6.4.5 接收數據 240
6.4.6 關閉Channel 245
6.4.7 小結 246
6.4.8 延伸閱讀 246
6.5 調度器 246
6.5.1 設計原理 247
6.5.2 數據結構 255
6.5.3 調度器啟動 260
6.5.4 創(chuàng)建Goroutine 261
6.5.5 調度循環(huán) 266
6.5.6 觸發(fā)調度 269
6.5.7 線程管理 274
6.5.8 小結 276
6.5.9 延伸閱讀 276
6.6 網絡輪詢器 276
6.6.1 設計原理 276
6.6.2 數據結構 280
6.6.3 多路復用 281
6.6.4 小結 288
6.6.5 延伸閱讀 289
6.7 系統(tǒng)監(jiān)控 289
6.7.1 設計原理 289
6.7.2 監(jiān)控循環(huán) 289
6.7.3 小結 296
第7章 內存管理 297
7.1 內存分配器 297
7.1.1 設計原理 297
7.1.2 內存管理組件 304
7.1.3 內存分配 317
7.1.4 小結 322
7.1.5 延伸閱讀 322
7.1.6 歷史變更 322
7.2 垃圾收集器 323
7.2.1 設計原理 323
7.2.2 演進過程 331
7.2.3 實現原理 334
7.2.4 小結 358
7.2.5 延伸閱讀 358
7.3 ??臻g管理 358
7.3.1 設計原理 359
7.3.2 棧操作 363
7.3.3 小結 369
7.3.4 延伸閱讀 370
第8章 元編程 371
8.1 插件系統(tǒng) 371
8.1.1 設計原理 371
8.1.2 動態(tài)庫 373
8.1.3 小結 376
8.1.4 延伸閱讀 376
8.2 代碼生成 377
8.2.1 設計原理 377
8.2.2 代碼生成 377
8.2.3 小結 382
第9章 標準庫 383
9.1 JSON 383
9.1.1 設計原理 383
9.1.2 序列化 385
9.1.3 反序列化 389
9.1.4 小結 392
9.2 HTTP 392
9.2.1 設計原理 393
9.2.2 客戶端 395
9.2.3 服務端 402
9.2.4 小結 406
9.3 數據庫 406
9.3.1 設計原理 406
9.3.2 驅動接口 407
9.3.3 小結 410