本書(shū)從實(shí)踐出發(fā),全面講解Go語(yǔ)言的高級(jí)編程技術(shù)和應(yīng)用場(chǎng)景,涵蓋Go語(yǔ)言的底層機(jī)制、性能優(yōu)化、系統(tǒng)編程及前沿應(yīng)用等多個(gè)方面。全書(shū)共10章,第1章回顧Go語(yǔ)言的發(fā)展歷程,幫助讀者理解其設(shè)計(jì)理念和演進(jìn)過(guò)程;第2章和第3章系統(tǒng)介紹CGO編程與Go匯編語(yǔ)言的使用方法,使讀者能夠高效調(diào)用C庫(kù)并深入理解Go的底層實(shí)現(xiàn):第4章和第5章深入解析Go運(yùn)行時(shí)和編譯器,包括內(nèi)存管理、調(diào)度器、垃圾收集機(jī)制等相關(guān)技術(shù);第6章和第7章探討Go在RPC和 Web編程中的應(yīng)用,介紹Protobuf、 gRPC等核心技術(shù),并剖析Web框架的設(shè)計(jì)和優(yōu)化方案;第8章和第9章拓展Go的應(yīng)用邊界,涵蓋 WebAssembly 和GUI 編程,使Go語(yǔ)言不僅限于服務(wù)器端編程;第10章新增Go語(yǔ)言與大模型的結(jié)合,探索人工智能技術(shù)在Go生態(tài)系統(tǒng)中的應(yīng)用場(chǎng)景。 本書(shū)適合對(duì)Go語(yǔ)言有一定基礎(chǔ),希望深入理解其底層機(jī)制和高級(jí)應(yīng)用的開(kāi)發(fā)者閱讀。無(wú)論是系統(tǒng)工程師、后端開(kāi)發(fā)者,還是對(duì)Go語(yǔ)言運(yùn)行時(shí)、編譯器及新興技術(shù)感興趣的Go程序員,都能在本書(shū)中找到翔實(shí)的技術(shù)解析和實(shí)踐指南,達(dá)到高效開(kāi)發(fā)和技術(shù)進(jìn)階的目的。
·實(shí)踐導(dǎo)向,解析Go語(yǔ)言底層機(jī)制與性能優(yōu)化。
·涵蓋系統(tǒng)編程,拓展WebAssembly等前沿應(yīng)用。
·結(jié)合大模型技術(shù),探索Go語(yǔ)言人工智能場(chǎng)景。
·內(nèi)容系統(tǒng)詳實(shí),助力讀者快速進(jìn)階。
柴樹(shù)杉,Go語(yǔ)言代碼貢獻(xiàn)者,凹語(yǔ)言聯(lián)合發(fā)起人,編程語(yǔ)言開(kāi)放社區(qū)(PLOC)發(fā)起人。著有《Go語(yǔ)言定制指南》和《WebAssembly標(biāo)準(zhǔn)入門》等書(shū),F(xiàn)致力于推動(dòng)國(guó)產(chǎn)編程語(yǔ)言、少兒編程技術(shù)的發(fā)展。 曹春暉,在Web領(lǐng)域工作多年,開(kāi)源愛(ài)好者。構(gòu)建過(guò)多個(gè)大型網(wǎng)站系統(tǒng),對(duì)大型網(wǎng)站系統(tǒng)的架構(gòu)和性能有深刻理解。 王敏,畢業(yè)于中國(guó)地質(zhì)大學(xué)(武漢)藝術(shù)設(shè)計(jì)(動(dòng)畫(huà)方向)專業(yè)。參與《桃花源記》等網(wǎng)游界面設(shè)計(jì),現(xiàn)深耕兒童藝術(shù)教育,所著《兒童創(chuàng)意彩鉛》以專業(yè)視角開(kāi)啟少兒美學(xué)新境界。
目錄
第 1章 Go語(yǔ)言基礎(chǔ) 1
1.1 Go語(yǔ)言創(chuàng)世紀(jì) 1
1.1.1 來(lái)自貝爾實(shí)驗(yàn)室特有基因 2
1.1.2 你好,世界 4
1.2 Hello, World的革命 4
1.2.1 B語(yǔ)言Ken Thompson,1969 5
1.2.2 C語(yǔ)言Dennis Ritchie,19721989 5
1.2.3 NewsqueakRob Pike,1989 6
1.2.4 AlefPhil Winterbottom,1993 8
1.2.5 LimboSean Dorward,PhilWinterbottom,Rob Pike,1995 10
1.2.6 Go語(yǔ)言20072009 10
1.2.7 你好,世界!2.0版本 12
1.3 數(shù)組、字符串和切片 13
1.3.1 數(shù)組 13
1.3.2 字符串 16
1.3.3 切片 21
1.4 函數(shù)、方法和接口 27
1.4.1 函數(shù) 27
1.4.2 方法 31
1.4.3 接口 35
1.5 面向并發(fā)的內(nèi)存模型 39
1.5.1 goroutine和系統(tǒng)線程 40
1.5.2 原子操作 40
1.5.3 順序一致性內(nèi)存模型 44
1.5.4 初始化順序 45
1.5.5 goroutine的創(chuàng)建 46
1.5.6 基于通道的通信 46
1.5.7 不靠譜的同步 48
1.6 泛型編程 49
1.6.1 認(rèn)識(shí)Go語(yǔ)言的泛型 49
1.6.2 泛型和接口 50
1.6.3 運(yùn)行時(shí)Cloner[T]和T類型的區(qū)別 52
1.6.4 泛型后方法淪為二等公民 53
1.6.5 方法不支持泛型的原因 54
1.6.6 Go語(yǔ)言的泛型為何用方括號(hào) 54
1.7 自定義迭代器 55
1.7.1 使用迭代器 55
1.7.2 迭代器的定義 56
1.7.3 迭代器的原理 57
1.7.4 loopvar語(yǔ)義調(diào)整 58
1.8 補(bǔ)充說(shuō)明 59
第 2章 CGO編程 60
2.1 快速入門 60
2.1.1 最簡(jiǎn)CGO程序 60
2.1.2 基于C標(biāo)準(zhǔn)庫(kù)函數(shù)輸出字符串 61
2.1.3 使用自己的C語(yǔ)言函數(shù) 61
2.1.4 C代碼的模塊化 62
2.1.5 用Go重新實(shí)現(xiàn)C語(yǔ)言函數(shù) 63
2.1.6 面向C語(yǔ)言接口的Go編程 64
2.2 CGO基礎(chǔ) 65
2.2.1 import "C"語(yǔ)句 65
2.2.2 #cgo命令 67
2.2.3 build標(biāo)志條件編譯 68
2.3 類型轉(zhuǎn)換 69
2.3.1 數(shù)值類型的轉(zhuǎn)換 69
2.3.2 Go字符串和切片的轉(zhuǎn)換 71
2.3.3 結(jié)構(gòu)體、聯(lián)合和枚舉類型的轉(zhuǎn)換 72
2.3.4 數(shù)組、字符串和切片的轉(zhuǎn)換 75
2.3.5 指針間的轉(zhuǎn)換 78
2.3.6 數(shù)值和指針的轉(zhuǎn)換 79
2.3.7 切片間的轉(zhuǎn)換 79
2.4 函數(shù)調(diào)用 80
2.4.1 Go調(diào)用C語(yǔ)言函數(shù) 80
2.4.2 C語(yǔ)言函數(shù)的返回值 81
2.4.3 void函數(shù)的返回值 82
2.4.4 C調(diào)用Go導(dǎo)出函數(shù) 83
2.5 內(nèi)存模型 84
2.5.1 Go訪問(wèn)C內(nèi)存 84
2.5.2 C臨時(shí)訪問(wèn)傳入的Go內(nèi)存 85
2.5.3 C長(zhǎng)期持有Go指針對(duì)象 87
2.5.4 導(dǎo)出C語(yǔ)言函數(shù)不能返回Go內(nèi)存 88
2.5.5 runtime.Pinner類型 89
2.6 C 類封裝 90
2.6.1 C 類到Go語(yǔ)言對(duì)象 90
2.6.2 Go語(yǔ)言對(duì)象到C 類 95
2.6.3 徹底解放C 的this指針 98
2.7 MOSN帶來(lái)的優(yōu)化 100
2.8 補(bǔ)充說(shuō)明 101
第3章 Go匯編語(yǔ)言 102
3.1 快速入門 102
3.1.1 實(shí)現(xiàn)和聲明 102
3.1.2 定義整型變量 103
3.1.3 定義字符串類型變量 104
3.1.4 定義main()函數(shù) 107
3.1.5 特殊字符 108
3.1.6 沒(méi)有分號(hào) 108
3.2 計(jì)算機(jī)體系結(jié)構(gòu) 108
3.2.1 圖靈機(jī)和Brainfuck語(yǔ)言 109
3.2.2 《人力資源機(jī)器》游戲 110
3.2.3 x86-64體系結(jié)構(gòu) 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 變量的內(nèi)存布局 121
3.3.4 標(biāo)識(shí)符規(guī)則和特殊標(biāo)志 123
3.4 函數(shù) 123
3.4.1 基本語(yǔ)法 123
3.4.2 函數(shù)參數(shù)和返回值 125
3.4.3 參數(shù)和返回值的內(nèi)存布局 126
3.4.4 函數(shù)中的局部變量 128
3.4.5 調(diào)用其他函數(shù) 130
3.4.6 宏函數(shù) 132
3.5 控制流 132
3.5.1 順序執(zhí)行 132
3.5.2 if/goto跳轉(zhuǎn) 135
3.5.3 for循環(huán) 136
3.6 再論函數(shù) 138
3.6.1 函數(shù)調(diào)用規(guī)范 138
3.6.2 高級(jí)匯編語(yǔ)言 139
3.6.3 PCDATA和FUNCDATA 141
3.6.4 遞歸函數(shù):1到n求和 144
3.6.5 閉包函數(shù) 146
3.6.6 調(diào)用約定 148
3.7 匯編語(yǔ)言的威力 148
3.7.1 系統(tǒng)調(diào)用 148
3.7.2 直接調(diào)用C語(yǔ)言函數(shù) 150
3.7.3 AVX指令集 152
3.8 補(bǔ)充說(shuō)明 153
第4章 Go運(yùn)行時(shí) 155
4.1 運(yùn)行時(shí)概覽 155
4.1.1 調(diào)度器 155
4.1.2 內(nèi)存分配器 156
4.1.3 垃圾收集器 156
4.1.4 網(wǎng)絡(luò)輪詢器 156
4.1.5 小結(jié) 156
4.2 調(diào)度器 157
4.2.1 生產(chǎn)者細(xì)節(jié) 157
4.2.2 消費(fèi)者細(xì)節(jié) 158
4.2.3 任務(wù)隊(duì)列細(xì)節(jié) 159
4.2.4 處理阻塞 159
4.2.5 理解調(diào)度和延遲的關(guān)系 162
4.2.6 小結(jié) 164
4.3 內(nèi)存分配器 164
4.3.1 逃逸分析 164
4.3.2 操作系統(tǒng)內(nèi)存管理的二次抽象 165
4.3.3 內(nèi)存分配器簡(jiǎn)介 166
4.3.4 理解Go的內(nèi)存占用 168
4.3.5 小結(jié) 171
4.4 垃圾收集器 171
4.4.1 語(yǔ)法垃圾和語(yǔ)義垃圾 171
4.4.2 并發(fā)標(biāo)記清掃的核心流程 172
4.4.3 與Java分代機(jī)制的對(duì)比 173
4.4.4 一些常見(jiàn)的優(yōu)化思路 175
4.4.5 小結(jié) 175
4.5 網(wǎng)絡(luò)輪詢器 175
4.5.1 傳統(tǒng)網(wǎng)絡(luò)編程 176
4.5.2 Go對(duì)操作系統(tǒng)的網(wǎng)絡(luò)API的封裝 177
4.5.3 阻塞易理解,回調(diào)難理解 177
4.5.4 goroutine的掛起和喚醒流程 179
4.5.5 網(wǎng)絡(luò)輪詢器的缺陷 180
4.5.6 小結(jié) 181
4.6 運(yùn)行時(shí)性能分析 181
4.6.1 安裝依賴的Graphviz工具 181
4.6.2 CPU性能測(cè)試分析 182
4.6.3 內(nèi)存分配性能測(cè)試分析 183
4.6.4 在程序中增加性能分析 184
4.6.5 性能分析引導(dǎo)的優(yōu)化 185
4.6.6 持續(xù)性能分析 185
4.6.7 堆內(nèi)存性能分析 188
4.6.8 小結(jié) 189
4.7 補(bǔ)充說(shuō)明 189
第5章 Go編譯器 190
5.1 表達(dá)式 190
5.1.1 基礎(chǔ)表達(dá)式語(yǔ)法 190
5.1.2 表達(dá)式的語(yǔ)法分析 191
5.1.3 求值表達(dá)式 193
5.1.4 標(biāo)識(shí)符:為表達(dá)式中引入變量 193
5.2 類型檢查 195
5.2.1 語(yǔ)義錯(cuò)誤 195
5.2.2 go/types包 196
5.2.3 跨包的類型檢查 197
5.2.4 小結(jié) 200
5.3 語(yǔ)義分析 200
5.3.1 名字空間 200
5.3.2 整體架構(gòu) 203
5.3.3 小結(jié) 204
5.4 SSA 中間代碼 204
5.4.1 SSA簡(jiǎn)介 204
5.4.2 生成SSA 204
5.4.3 SSA解釋運(yùn)行 208
5.4.4 SSA包的架構(gòu) 209
5.4.5 小結(jié) 210
5.5 LLVM后端 210
5.5.1 最小編譯器 211
5.5.2 表達(dá)式手動(dòng)轉(zhuǎn)換到LLVM IR程序 212
5.5.3 表達(dá)式自動(dòng)轉(zhuǎn)換到LLVM IR程序 212
5.5.4 小結(jié) 214
5.6 示例:檢查append參數(shù) 214
5.6.1 append()函數(shù)的參數(shù)陷阱 214
5.6.2 Go語(yǔ)言社區(qū)的不同觀點(diǎn) 215
5.6.3 統(tǒng)計(jì)真實(shí)代碼發(fā)現(xiàn)問(wèn)題 215
5.6.4 go vet自動(dòng)識(shí)別這類問(wèn)題 216
5.7 補(bǔ)充說(shuō)明 217
第6章 RPC和Protobuf 218
6.1 RPC入門 218
6.1.1 RPC版Hello, World 218
6.1.2 更安全的RPC接口 219
6.1.3 跨語(yǔ)言的RPC 222
6.1.4 HTTP上的RPC 224
6.2 Protobuf 225
6.2.1 Protobuf入門 225
6.2.2 定制代碼生成插件 227
6.2.3 自動(dòng)生成完整的RPC代碼 230
6.3 玩轉(zhuǎn)RPC 233
6.3.1 客戶端RPC的實(shí)現(xiàn)原理 233
6.3.2 基于RPC實(shí)現(xiàn)監(jiān)視功能 234
6.3.3 反向RPC 237
6.3.4 上下文信息 238
6.4 gRPC入門 239
6.4.1 gRPC技術(shù)棧 239
6.4.2 gRPC簡(jiǎn)介 240
6.4.3 gRPC流 241
6.4.4 發(fā)布/訂閱模式 244
6.5 gRPC進(jìn)階 247
6.5.1 證書(shū)認(rèn)證 247
6.5.2 令牌認(rèn)證 251
6.5.3 截取器 253
6.5.4 與Web服務(wù)共存 254
6.6 gRPC和Protobuf擴(kuò)展 255
6.6.1 驗(yàn)證器 256
6.6.2 REST風(fēng)格的接口 258
6.6.3 Nginx 261
6.7 基于Protobuf的框架pbgo 261
6.7.1 Protobuf擴(kuò)展語(yǔ)法 262
6.7.2 插件中讀取擴(kuò)展信息 263
6.7.3 生成REST風(fēng)格的接口的代碼 264
6.7.4 啟動(dòng)REST服務(wù) 266
6.8 補(bǔ)充說(shuō)明 266
第7章 Go Web編程 267
7.1 Go Web編程簡(jiǎn)介 267
7.2 請(qǐng)求路由 270
7.2.1 HttpRouter簡(jiǎn)介 271
7.2.2 HttpRouter原理 273
7.2.3 壓縮檢索樹(shù)創(chuàng)建過(guò)程 274
7.3 中間件 278
7.3.1 代碼泥潭 278
7.3.2 使用中間件剝離非業(yè)務(wù)邏輯 280
7.3.3 更優(yōu)雅的中間件寫(xiě)法 282
7.3.4 在中間件中適合做哪些事情 283
7.4 請(qǐng)求驗(yàn)證 284
7.4.1 重構(gòu)請(qǐng)求驗(yàn)證函數(shù) 285
7.4.2 用請(qǐng)求驗(yàn)證器減少重復(fù)勞動(dòng) 286
7.4.3 請(qǐng)求驗(yàn)證器原理 287
7.5 與數(shù)據(jù)庫(kù)交互 290
7.5.1 從database/sql講起 290
7.5.2 提高生產(chǎn)效率的ORM和SQL構(gòu)建器 292
7.5.3 隱式SQL導(dǎo)致線上故障 294
7.5.4 基于SQLC的數(shù)據(jù)層開(kāi)發(fā) 295
7.6 服務(wù)流量限制 296
7.6.1 流量限制算法令牌桶算法 298
7.6.2 令牌桶算法原理 300
7.6.3 服務(wù)瓶頸和QoS 302
7.7 大型Web項(xiàng)目的分層 302
7.8 接口和表驅(qū)動(dòng)開(kāi)發(fā) 308
7.8.1 業(yè)務(wù)系統(tǒng)的發(fā)展過(guò)程 308
7.8.2 使用函數(shù)封裝業(yè)務(wù)流程 308
7.8.3 使用接口進(jìn)行抽象 309
7.8.4 接口的優(yōu)缺點(diǎn) 312
7.8.5 表驅(qū)動(dòng)開(kāi)發(fā) 313
7.9 灰度發(fā)布 314
7.9.1 通過(guò)分批次部署實(shí)現(xiàn)灰度發(fā)布 314
7.9.2 通過(guò)業(yè)務(wù)規(guī)則進(jìn)行灰度發(fā)布 315
7.9.3 如何實(shí)現(xiàn)灰度發(fā)布規(guī)則 317
7.10 現(xiàn)代Go語(yǔ)言后端編程 320
7.10.1 Go Micro 321
7.10.2 Kratos 322
7.10.3 go-zero 322
7.10.4 小結(jié) 323
7.11 補(bǔ)充說(shuō)明 323
第8章 Go和WebAssembly 324
8.1 WebAssembly簡(jiǎn)介 324
8.1.1 誕生背景 324
8.1.2 終將被編譯為WebAssembly 325
8.2 你好,WebAssembly 325
8.2.1 用Go語(yǔ)言生成并執(zhí)行WebAssembly模塊 325
8.2.2 在Node.js中執(zhí)行WebAssembly模塊 326
8.2.3 在瀏覽器中執(zhí)行WebAssembly模塊 326
8.2.4 小結(jié) 328
8.3 外部函數(shù)接口 328
8.3.1 使用JavaScript函數(shù) 328
8.3.2 回調(diào)Go語(yǔ)言函數(shù) 330
8.3.3 syscall/js包 332
8.3.4 WebAssembly模塊的導(dǎo)入函數(shù) 334
8.3.5 WASI規(guī)范 337
8.4 WebAssembly虛擬機(jī) 337
8.4.1 構(gòu)建WebAssembly模塊 337
8.4.2 通過(guò)虛擬機(jī)執(zhí)行 338
8.4.3 小結(jié) 338
8.5 示例:WebAssembly插件 338
8.5.1 MOSN的WebAssembly插件
架構(gòu)設(shè)計(jì) 339
8.5.2 認(rèn)識(shí)Proxy-Wasm規(guī)范 339
8.5.3 處理HTTP請(qǐng)求示例 341
8.5.4 小結(jié) 343
8.6 導(dǎo)出Go語(yǔ)言函數(shù) 343
8.6.1 構(gòu)建WebAssembly模塊 343
8.6.2 執(zhí)行WebAssembly模塊 344
8.6.3 運(yùn)行時(shí)限制 345
8.7 補(bǔ)充說(shuō)明 345
第9章 Go GUI編程 346
9.1 Shiny框架入門 346
9.1.1 Hello, Shiny 346
9.1.2 顯示圖像 347
9.1.3 核心組件 348
9.1.4 底層驅(qū)動(dòng)程序 349
9.2 Fyne框架入門 350
9.2.1 安裝環(huán)境 350
9.2.2 安裝Fyne核心庫(kù) 350
9.2.3 Hello, Fyne 350
9.2.4 回調(diào)函數(shù) 351
9.2.5 對(duì)話框 352
9.2.6 畫(huà)布 354
9.2.7 布局管理 363
9.2.8 Fyne在瀏覽器中 367
9.3 Walk框架入門 370
9.3.1 你好, Walk 370
9.3.2 聲明式語(yǔ)法 371
9.3.3 通過(guò).manifest文件指定依賴 372
9.3.4 內(nèi)置.manifest文件 373
9.3.5 給可執(zhí)行程序添加圖標(biāo) 373
9.3.6 添加版本信息 374
9.3.7 Walk的工作原理 375
9.4 國(guó)際化支持 379
9.4.1 你好,世界! 379
9.4.2 國(guó)際化實(shí)現(xiàn)原理 379
9.4.3 你好,世界!多語(yǔ)言版 380
9.4.4 制作翻譯文件 380
9.4.5 本地的語(yǔ)言環(huán)境 381
9.4.6 為何如此煩瑣 381
9.5 補(bǔ)充說(shuō)明 381
第 10章 大模型 382
10.1 AI機(jī)器人gabyhelp 382
10.1.1 Gaby框架 382
10.1.2 如何接入大語(yǔ)言模型 384
10.1.3 小結(jié) 386
10.2 DeepSeek 386
10.2.1 生成API key 386
10.2.2 Go語(yǔ)言SDK 387
10.2.3 Go語(yǔ)言驗(yàn)證服務(wù) 389
10.2.4 多輪對(duì)話補(bǔ)全 389
10.2.5 推理模型 390
10.2.6 交互式對(duì)話 391
10.2.7 小結(jié) 393
10.3 LangChain for Go 393
10.3.1 連接OpenAI的大模型 393
10.3.2 連接DeepSeek 393
10.3.3 構(gòu)建大模型聊天應(yīng)用 394
10.3.4 小結(jié) 398
10.4 Ollama 398
10.4.1 安裝Ollama 398
10.4.2 下載大模型 399
10.4.3 運(yùn)行大模型 400
10.4.4 本地大模型驅(qū)動(dòng)聊天應(yīng)用 401
10.4.5 小結(jié) 402
10.5 大模型智能體 402
10.5.1 計(jì)算常量表達(dá)式 402
10.5.2 集成到大模型流程中 402
10.5.3 應(yīng)用到聊天服務(wù)中 404
10.5.4 小結(jié) 405
10.6 補(bǔ)充說(shuō)明 405
后記 406