作者簡介
柴樹杉,Go語言代碼貢獻者,凹語言聯合發起人,編程語言開放社區(PLOC)發起人。著有《Go語言 指南》和《WebAssembly標準入門》等書。現致力於推動國產編程語言、少兒編程技術的發展。
曹春暉,在Web領域工作多年,開源愛好者。構建過多個大型網站系統,對大型網站系統的架構和性能有深刻理解。
王敏,畢業于中國地質大學(武漢)藝術設計(動畫方向)專業。參與《桃花源記》等網遊界面設計,現深耕兒童藝術教育,所著《兒童創意彩鉛》以專業視角開啟少兒美學新境界。
目錄
目錄
第 1章 Go語言基礎1
1 1 Go語言創世紀1
1 1 1 來自貝爾實驗室特有基因2
1 1 2 你好,世界4
1 2 “Hello, World”的革命4
1 2 1 B語言—Ken Thompson,19695
1 2 2 C語言—Dennis Ritchie,1972—19895
1 2 3 Newsqueak—Rob Pike,19896
1 2 4 Alef—Phil Winterbottom,19938
1 2 5 Limbo—Sean Dorward,PhilWinterbottom,Rob Pike,199510
1 2 6 Go語言—2007—200910
1 2 7 你好,世界!—2 0版本12
1 3 數組、字符串和切片13
1 3 1 數組13
1 3 2 字符串16
1 3 3 切片21
1 4 函數、方法和接口27
1 4 1 函數27
1 4 2 方法31
1 4 3 接口35
1 5 面向併發的內存模型39
1 5 1 goroutine和系統線程40
1 5 2 原子操作40
1 5 3 順序一致性內存模型44
1 5 4 初始化順序45
1 5 5 goroutine的創建46
1 5 6 基於通道的通信46
1 5 7 不靠譜的同步48
1 6 泛型編程49
1 6 1 認識Go語言的泛型49
1 6 2 泛型和接口50
1 6 3 運行時Cloner[T]和T類型的區別52
1 6 4 泛型後方法淪為”二等公民”53
1 6 5 方法不支持泛型的原因54
1 6 6 Go語言的泛型為何用方括號54
1 7 自定義迭代器55
1 7 1 使用迭代器55
1 7 2 迭代器的定義56
1 7 3 迭代器的原理57
1 7 4 loopvar語義調整58
1 8 補充說明59
第 2章 CGO編程60
2 1 快速入門60
2 1 1 簡CGO程序60
2 1 2 基於C標準庫函數輸出字符串61
2 1 3 使用自己的C語言函數61
2 1 4 C代碼的模塊化62
2 1 5 用Go重新實現C語言函數63
2 1 6 面向C語言接口的Go編程64
2 2 CGO基礎65
2 2 1 import \\\\\\\”C\\\\\\\”語句65
2 2 2 #cgo命令67
2 2 3 build標誌條件編譯68
2 3 類型轉換69
2 3 1 數值類型的轉換69
2 3 2 Go字符串和切片的轉換71
2 3 3 結構體、聯合和枚舉類型的轉換72
2 3 4 數組、字符串和切片的轉換75
2 3 5 指針間的轉換78
2 3 6 數值和指針的轉換79
2 3 7 切片間的轉換79
2 4 函數調用80
2 4 1 Go調用C語言函數80
2 4 2 C語言函數的返回值81
2 4 3 void函數的返回值82
2 4 4 C調用Go導出函數83
2 5 內存模型84
2 5 1 Go訪問C內存84
2 5 2 C臨時訪問傳入的Go內存85
2 5 3 C長期持有Go指針對象87
2 5 4 導出C語言函數不能返回Go內存88
2 5 5 runtime Pinner類型89
2 6 C++類封裝90
2 6 1 C++類到Go語言對象90
2 6 2 Go語言對象到C++類95
2 6 3 解放C++的this指針98
2 7 MOSN帶來的優化100
2 8 補充說明101
第3章 Go匯編語言102
3 1 快速入門102
3 1 1 實現和聲明102
3 1 2 定義整型變量103
3 1 3 定義字符串類型變量104
3 1 4 定義main()函數107
3 1 5 特殊字符108
3 1 6 沒有分號108
3 2 計算機體系結構108
3 2 1 圖靈機和Brainfuck語言109
3 2 2 《人力資源機器》遊戲110
3 2 3 x86-64體系結構111
3 2 4 Go彙編中的偽寄存器112
3 2 5 x86-64指令集113
3 2 6 ARM64指令集115
3 3 常量和全局變量116
3 3 1 常量116
3 3 2 全局變量117
3 3 3 變量的內存佈局121
3 3 4 標識符規則和特殊標誌123
3 4 函數123
3 4 1 基本語法123
3 4 2 函數參數和返回值125
3 4 3 參數和返回值的內存佈局126
3 4 4 函數中的局部變量128
3 4 5 調用其他函數130
3 4 6 宏函數132
3 5 控制流132
3 5 1 順序執行132
3 5 2 if/goto跳轉135
3 5 3 for循環136
3 6 再論函數138
3 6 1 函數調用規範138
3 6 2 匯編語言139
3 6 3 PCDATA和FUNCDATA141
3 6 4 遞歸函數:1到n求和144
3 6 5 閉包函數146
3 6 6 調用約定148
3 7 匯編語言的威力148
3 7 1 系統調用148
3 7 2 直接調用C語言函數150
3 7 3 AVX指令集152
3 8 補充說明153
第4章 Go運行時155
4 1 運行時概覽155
4 1 1 調度器155
4 1 2 內存分配器156
4 1 3 垃圾收集器156
4 1 4 網絡輪詢器156
4 1 5 小結156
4 2 調度器157
4 2 1 生產者細節 157
4 2 2 消費者細節 158
4 2 3 任務隊列細節 159
4 2 4 處理阻塞159
4 2 5 理解調度和延遲的關係162
4 2 6 小結164
4 3 內存分配器164
4 3 1 逃逸分析164
4 3 2 操作系統內存管理的二次抽象165
4 3 3 內存分配器簡介166
4 3 4 理解Go的內存佔用168
4 3 5 小結171
4 4 垃圾收集器171
4 4 1 語法垃圾和語義垃圾171
4 4 2 併發標記清掃的核心流程172
4 4 3 與Java分代機制的對比173
4 4 4 一些常見的優化思路175
4 4 5 小結175
4 5 網絡輪詢器175
4 5 1 傳統網絡編程176
4 5 2 Go對操作系統的網絡API的封裝177
4 5 3 阻塞易理解,回調難理解177
4 5 4 goroutine的掛起和喚醒流程179
4 5 5 網絡輪詢器的缺陷180
4 5 6 小結181
4 6 運行時性能分析181
4 6 1 安裝依賴的Graphviz工具181
4 6 2 CPU性能測試分析182
4 6 3 內存分配性能測試分析183
4 6 4 在程序中增加性能分析184
4 6 5 性能分析引導的優化185
4 6 6 持續性能分析185
4 6 7 堆內存性能分析188
4 6 8 小結189
4 7 補充說明189
第5章 Go編譯器190
5 1 表達式190
5 1 1 基礎表達式語法190
5 1 2 表達式的語法分析191
5 1 3 求值表達式193
5 1 4 標識符:為表達式中引入變量193
5 2 類型檢查195
5 2 1 語義錯誤195
5 2 2 go/types包196
5 2 3 跨包的類型檢查197
5 2 4 小結200
5 3 語義分析200
5 3 1 名字空間200
5 3 2 整體架構203
5 3 3 小結204
5 4 SSA 中間代碼204
5 4 1 SSA簡介204
5 4 2 生成SSA204
5 4 3 SSA解釋運行208
5 4 4 SSA包的架構209
5 4 5 小結210
5 5 LLVM後端210
5 5 1 小編譯器211
5 5 2 表達式手動轉換到LLVM IR程序212
5 5 3 表達式自動轉換到LLVM IR程序212
5 5 4 小結214
5 6 示例:檢查append參數214
5 6 1 append()函數的參數陷阱214
5 6 2 Go語言社區的不同觀點215
5 6 3 統計真實代碼發現問題215
5 6 4 go vet自動識別這類問題216
5 7 補充說明217
第6章 RPC和Protobuf218
6 1 RPC入門218
6 1 1 RPC版”Hello, World”218
6 1 2 安全的RPC接口219
6 1 3 跨語言的RPC222
6 1 4 HTTP上的RPC224
6 2 Protobuf225
6 2 1 Protobuf入門225
6 2 2 代碼生成插件227
6 2 3 自動生成完整的RPC代碼230
6 3 玩轉RPC233
6 3 1 客戶端RPC的實現原理233
6 3 2 基於RPC實現監視功能234
6 3 3 反向RPC237
6 3 4 上下文信息238
6 4 gRPC入門239
6 4 1 gRPC技術棧239
6 4 2 gRPC簡介240
6 4 3 gRPC流241
6 4 4 發佈/訂閱模式244
6 5 gRPC進階247
6 5 1 證書認證247
6 5 2 令牌認證251
6 5 3 截取器253
6 5 4 與Web服務共存254
6 6 gRPC和Protobuf擴展255
6 6 1 驗證器256
6 6 2 REST風格的接口258
6 6 3 Nginx261
6 7 基於Protobuf的框架pbgo261
6 7 1 Protobuf擴展語法262
6 7 2 插件中讀取擴展信息263
6 7 3 生成REST風格的接口的代碼264
6 7 4 啟動REST服務266
6 8 補充說明266
第7章 Go Web編程267
7 1 Go Web編程簡介267
7 2 請求路由270
7 2 1 HttpRouter簡介271
7 2 2 HttpRouter原理273
7 2 3 壓縮檢索樹創建過程274