本書從實(shí)踐出發(fā),全面講解Go語言的高級編程技術(shù)和應(yīng)用場景,涵蓋Go語言的底層機(jī)制、性能優(yōu)化、系統(tǒng)編程及前沿應(yīng)用等多個方面。全書共10章,第1章回顧Go語言的發(fā)展歷程,幫助讀者理解其設(shè)計(jì)理念和演進(jìn)過程;第2章和第3章系統(tǒng)介紹CGO編程與Go匯編語言的使用方法,使讀者能夠高效調(diào)用C庫并深入理解Go的底層實(shí)現(xiàn):第4章和第5章深入解析Go運(yùn)行時和編譯器,包括內(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語言不僅限于服務(wù)器端編程;第10章新增Go語言與大模型的結(jié)合,探索人工智能技術(shù)在Go生態(tài)系統(tǒng)中的應(yīng)用場景。 本書適合對Go語言有一定基礎(chǔ),希望深入理解其底層機(jī)制和高級應(yīng)用的開發(fā)者閱讀。無論是系統(tǒng)工程師、后端開發(fā)者,還是對Go語言運(yùn)行時、編譯器及新興技術(shù)感興趣的Go程序員,都能在本書中找到翔實(shí)的技術(shù)解析和實(shí)踐指南,達(dá)到高效開發(fā)和技術(shù)進(jìn)階的目的。
·實(shí)踐導(dǎo)向,解析Go語言底層機(jī)制與性能優(yōu)化。
·涵蓋系統(tǒng)編程,拓展WebAssembly等前沿應(yīng)用。
·結(jié)合大模型技術(shù),探索Go語言人工智能場景。
·內(nèi)容系統(tǒng)詳實(shí),助力讀者快速進(jìn)階。
柴樹杉,Go語言代碼貢獻(xiàn)者,凹語言聯(lián)合發(fā)起人,編程語言開放社區(qū)(PLOC)發(fā)起人。著有《Go語言定制指南》和《WebAssembly標(biāo)準(zhǔn)入門》等書,F(xiàn)致力于推動國產(chǎn)編程語言、少兒編程技術(shù)的發(fā)展。 曹春暉,在Web領(lǐng)域工作多年,開源愛好者。構(gòu)建過多個大型網(wǎng)站系統(tǒng),對大型網(wǎng)站系統(tǒng)的架構(gòu)和性能有深刻理解。 王敏,畢業(yè)于中國地質(zhì)大學(xué)(武漢)藝術(shù)設(shè)計(jì)(動畫方向)專業(yè)。參與《桃花源記》等網(wǎng)游界面設(shè)計(jì),現(xiàn)深耕兒童藝術(shù)教育,所著《兒童創(chuàng)意彩鉛》以專業(yè)視角開啟少兒美學(xué)新境界。
目錄
第 1章 Go語言基礎(chǔ) 1
1.1 Go語言創(chuàng)世紀(jì) 1
1.1.1 來自貝爾實(shí)驗(yàn)室特有基因 2
1.1.2 你好,世界 4
1.2 Hello, World的革命 4
1.2.1 B語言Ken Thompson,1969 5
1.2.2 C語言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語言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)識Go語言的泛型 49
1.6.2 泛型和接口 50
1.6.3 運(yùn)行時Cloner[T]和T類型的區(qū)別 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語義調(diào)整 58
1.8 補(bǔ)充說明 59
第 2章 CGO編程 60
2.1 快速入門 60
2.1.1 最簡CGO程序 60
2.1.2 基于C標(biāo)準(zhǔn)庫函數(shù)輸出字符串 61
2.1.3 使用自己的C語言函數(shù) 61
2.1.4 C代碼的模塊化 62
2.1.5 用Go重新實(shí)現(xiàn)C語言函數(shù) 63
2.1.6 面向C語言接口的Go編程 64
2.2 CGO基礎(chǔ) 65
2.2.1 import "C"語句 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語言函數(shù) 80
2.4.2 C語言函數(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訪問C內(nèi)存 84
2.5.2 C臨時訪問傳入的Go內(nèi)存 85
2.5.3 C長期持有Go指針對象 87
2.5.4 導(dǎo)出C語言函數(shù)不能返回Go內(nèi)存 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帶來的優(yōu)化 100
2.8 補(bǔ)充說明 101
第3章 Go匯編語言 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 沒有分號 108
3.2 計(jì)算機(jī)體系結(jié)構(gòu) 108
3.2.1 圖靈機(jī)和Brainfuck語言 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)識符規(guī)則和特殊標(biāo)志 123
3.4 函數(shù) 123
3.4.1 基本語法 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 高級匯編語言 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 匯編語言的威力 148
3.7.1 系統(tǒng)調(diào)用 148
3.7.2 直接調(diào)用C語言函數(shù) 150
3.7.3 AVX指令集 152
3.8 補(bǔ)充說明 153
第4章 Go運(yùn)行時 155
4.1 運(yùn)行時概覽 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)存分配器簡介 166
4.3.4 理解Go的內(nèi)存占用 168
4.3.5 小結(jié) 171
4.4 垃圾收集器 171
4.4.1 語法垃圾和語義垃圾 171
4.4.2 并發(fā)標(biāo)記清掃的核心流程 172
4.4.3 與Java分代機(jī)制的對比 173
4.4.4 一些常見的優(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對操作系統(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)行時性能分析 181
4.6.1 安裝依賴的Graphviz工具 181
4.6.2 CPU性能測試分析 182
4.6.3 內(nèi)存分配性能測試分析 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ǔ)充說明 189
第5章 Go編譯器 190
5.1 表達(dá)式 190
5.1.1 基礎(chǔ)表達(dá)式語法 190
5.1.2 表達(dá)式的語法分析 191
5.1.3 求值表達(dá)式 193
5.1.4 標(biāo)識符:為表達(dá)式中引入變量 193
5.2 類型檢查 195
5.2.1 語義錯誤 195
5.2.2 go/types包 196
5.2.3 跨包的類型檢查 197
5.2.4 小結(jié) 200
5.3 語義分析 200
5.3.1 名字空間 200
5.3.2 整體架構(gòu) 203
5.3.3 小結(jié) 204
5.4 SSA 中間代碼 204
5.4.1 SSA簡介 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á)式手動轉(zhuǎn)換到LLVM IR程序 212
5.5.3 表達(dá)式自動轉(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語言社區(qū)的不同觀點(diǎn) 215
5.6.3 統(tǒng)計(jì)真實(shí)代碼發(fā)現(xiàn)問題 215
5.6.4 go vet自動識別這類問題 216
5.7 補(bǔ)充說明 217
第6章 RPC和Protobuf 218
6.1 RPC入門 218
6.1.1 RPC版Hello, World 218
6.1.2 更安全的RPC接口 219
6.1.3 跨語言的RPC 222
6.1.4 HTTP上的RPC 224
6.2 Protobuf 225
6.2.1 Protobuf入門 225
6.2.2 定制代碼生成插件 227
6.2.3 自動生成完整的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簡介 240
6.4.3 gRPC流 241
6.4.4 發(fā)布/訂閱模式 244
6.5 gRPC進(jìn)階 247
6.5.1 證書認(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ò)展語法 262
6.7.2 插件中讀取擴(kuò)展信息 263
6.7.3 生成REST風(fēng)格的接口的代碼 264
6.7.4 啟動REST服務(wù) 266
6.8 補(bǔ)充說明 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 壓縮檢索樹創(chuàng)建過程 274
7.3 中間件 278
7.3.1 代碼泥潭 278
7.3.2 使用中間件剝離非業(yè)務(wù)邏輯 280
7.3.3 更優(yōu)雅的中間件寫法 282
7.3.4 在中間件中適合做哪些事情 283
7.4 請求驗(yàn)證 284
7.4.1 重構(gòu)請求驗(yàn)證函數(shù) 285
7.4.2 用請求驗(yàn)證器減少重復(fù)勞動 286
7.4.3 請求驗(yàn)證器原理 287
7.5 與數(shù)據(jù)庫交互 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ù)層開發(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ū)動開發(fā) 308
7.8.1 業(yè)務(wù)系統(tǒng)的發(fā)展過程 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ū)動開發(fā) 313
7.9 灰度發(fā)布 314
7.9.1 通過分批次部署實(shí)現(xiàn)灰度發(fā)布 314
7.9.2 通過業(yè)務(wù)規(guī)則進(jìn)行灰度發(fā)布 315
7.9.3 如何實(shí)現(xiàn)灰度發(fā)布規(guī)則 317
7.10 現(xiàn)代Go語言后端編程 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ǔ)充說明 323
第8章 Go和WebAssembly 324
8.1 WebAssembly簡介 324
8.1.1 誕生背景 324
8.1.2 終將被編譯為WebAssembly 325
8.2 你好,WebAssembly 325
8.2.1 用Go語言生成并執(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語言函數(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 通過虛擬機(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)識Proxy-Wasm規(guī)范 339
8.5.3 處理HTTP請求示例 341
8.5.4 小結(jié) 343
8.6 導(dǎo)出Go語言函數(shù) 343
8.6.1 構(gòu)建WebAssembly模塊 343
8.6.2 執(zhí)行WebAssembly模塊 344
8.6.3 運(yùn)行時限制 345
8.7 補(bǔ)充說明 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ū)動程序 349
9.2 Fyne框架入門 350
9.2.1 安裝環(huán)境 350
9.2.2 安裝Fyne核心庫 350
9.2.3 Hello, Fyne 350
9.2.4 回調(diào)函數(shù) 351
9.2.5 對話框 352
9.2.6 畫布 354
9.2.7 布局管理 363
9.2.8 Fyne在瀏覽器中 367
9.3 Walk框架入門 370
9.3.1 你好, Walk 370
9.3.2 聲明式語法 371
9.3.3 通過.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 國際化支持 379
9.4.1 你好,世界! 379
9.4.2 國際化實(shí)現(xiàn)原理 379
9.4.3 你好,世界!多語言版 380
9.4.4 制作翻譯文件 380
9.4.5 本地的語言環(huán)境 381
9.4.6 為何如此煩瑣 381
9.5 補(bǔ)充說明 381
第 10章 大模型 382
10.1 AI機(jī)器人gabyhelp 382
10.1.1 Gaby框架 382
10.1.2 如何接入大語言模型 384
10.1.3 小結(jié) 386
10.2 DeepSeek 386
10.2.1 生成API key 386
10.2.2 Go語言SDK 387
10.2.3 Go語言驗(yàn)證服務(wù) 389
10.2.4 多輪對話補(bǔ)全 389
10.2.5 推理模型 390
10.2.6 交互式對話 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ū)動聊天應(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ǔ)充說明 405
后記 406