聊一聊《深入 Go 語言原理、關(guān)鍵技術(shù)和實(shí)戰(zhàn)》(文末送書)
距離上次出版《Go語言高并發(fā)和微服務(wù)實(shí)戰(zhàn)》一書已經(jīng)過去了3年 ,看著手中剛收到的《深入 Go 語言原理、關(guān)鍵技術(shù)和實(shí)戰(zhàn)》,不僅思緒萬千。 從21年初開始籌劃到今年4月份最終出版,一共花費(fèi)了兩年左右的時(shí)間,個(gè)中滋味以及對(duì)此書的寄托,盡在此文,慢慢向大家說來。
緣由
和鑫哥 @a oho 和黃總 @CANG WU 早前已經(jīng)合作編寫并出版了 《Go語言高 并發(fā)和微服務(wù)實(shí)戰(zhàn)》 一書,主要講解 Go 入門語法和微服務(wù)領(lǐng)域?qū)崙?zhàn)。但是對(duì)于 Go 語言本身語法和特性并未深入了解,隨著日常使用 Go 語言開發(fā)開源項(xiàng)目,我們?cè)桨l(fā)覺得 Go 語言語法雖然簡(jiǎn)潔,但是背后的原理和實(shí)現(xiàn)卻很復(fù)雜,無論是協(xié)程,Channel 還是 Go 語言的泛型系統(tǒng),如果不了解它的原理,就很容易發(fā)生錯(cuò)誤。所以,我們決定全面深入學(xué)習(xí) Go 語言的特性實(shí)現(xiàn),從 Go 語言源碼入手,詳細(xì)介紹 Go 語言各類語法和特性的原理,實(shí)現(xiàn)和調(diào)優(yōu)方式。由此,形成了本書的主體內(nèi)容和大綱。
后續(xù)就是大家按照自己熟悉的領(lǐng)域劃劃分章節(jié),各自去準(zhǔn)備材料,設(shè)計(jì)代碼,編輯初稿,自我審閱;然后交換審閱,按照審閱意見修改;交給編輯審閱,再修改,再審閱,再修改.... 一本書,不僅包含了兩年的時(shí)光,也傾注了三人和編輯們的付出和努力 。

隨著 Go 1.18 等重大版本發(fā)布,Go語言更加成熟,機(jī)制更加完善,缺點(diǎn)更加少;Go 相關(guān)的開源項(xiàng)目比如 Docker,Etcd,Prometheus 都已經(jīng)成為頂級(jí)開源項(xiàng)目,使用 Go 編寫的小型中間件項(xiàng)目更是數(shù)不盡數(shù);頭條,滴滴,騰訊,b站等各大公司也都正在使用 Go 或者將原有項(xiàng)目遷移到 Go。所以,Go 語言在未來一段時(shí)間會(huì)持續(xù)流行,甚至變得更加流行,超越 Java。
本書內(nèi)容以介紹 Go 語言特性及其底層實(shí)現(xiàn)原理為主線 ,也會(huì)將 Go 語言和其他主流語言進(jìn)行對(duì)比,比如說 C++、Java 和 Rust,通過對(duì)比讓讀者更加了解語言特性背后的原理和實(shí)現(xiàn)機(jī)制,為后續(xù)學(xué)習(xí)其他語言打下良好基礎(chǔ)。 本書包含三個(gè)部分的內(nèi)容:
-
第一部分,淺談高級(jí)編程語言歷史和分類,講述Go 語言最鮮明的語法特征,介紹Go 語言常用數(shù)據(jù)結(jié)構(gòu)和并發(fā)原語。
-
第二部分,依次深入介紹Go 語言特性的原理及其實(shí)現(xiàn)。
-
第三部分,通過開源項(xiàng)目深入了解Go 語言特性,并介紹Go 語言相關(guān)的最佳實(shí)踐(如工程化和etcd 存儲(chǔ))。
歡迎購買筆者的圖書,現(xiàn)已出版上市,可以通過下方的二維碼購買。

第1章 高級(jí)編程語言以及Go 語言基礎(chǔ)
1.1 高級(jí)語言簡(jiǎn)介1
1.1.1 程序設(shè)計(jì)語言的定義2
1.1.2 程序設(shè)計(jì)語言的發(fā)展歷史 4
1.1.3 高級(jí)語言分類5
1.2 為什么要研究編程語言8
1.2.1 當(dāng)今流行編程語言的概況 8
1.2.2 效率是程序語言流行的決定因素 9
1.2.3 了解高級(jí)語言的重要性 12
1.3 本書的主角:Go 語言13
1.3.1 體現(xiàn)Go 語言特性的五個(gè)關(guān)鍵詞14
1.3.2 Go 語言基礎(chǔ)語法15
1.4 本章小結(jié) 23
第2 章 數(shù)據(jù)結(jié)構(gòu)源碼分析
2.1 數(shù)組 24
2.1.1 數(shù)組的基礎(chǔ)使用25
2.1.2 數(shù)組的底層數(shù)據(jù)結(jié)構(gòu)27
2.1.3 數(shù)組的越界檢查29
2.2 字符串 30
2.2.1 Go 語言字符串的基礎(chǔ)操作 30
2.2.2 Go 語言字符串的底層數(shù)據(jù)結(jié)構(gòu) 33
2.2.3 Go 語言字符串的拼接 34
2.2.4 Go 語言字符串的類型轉(zhuǎn)換 35
2.3 切片 37
2.3.1 切片的基礎(chǔ)操作37
2.3.2 切片的底層數(shù)據(jù)結(jié)構(gòu)38
2.3.3 切片的追加操作39
2.3.4 切片的刪除操作43
2.4 哈希表 44
2.4.1 哈希表的基礎(chǔ)操作44
2.4.2 哈希表底層數(shù)據(jù)結(jié)構(gòu)45
2.4.3 哈希表的初始化47
2.4.4 哈希表的讀取操作49
2.4.5 哈希表的寫入操作50
2.4.6 刪除操作53
2.4.7 哈希表的擴(kuò)容操作54
2.5 本章小結(jié) 60
第3 章 Go 語言的并發(fā)結(jié)構(gòu)
3.1 鎖控制 61
3.1.1 互斥鎖Mutext62
3.1.2 讀/寫鎖RWMutext 69
3.2 協(xié)程編排 71
3.2.1 協(xié)同等待的WaitGroup72
3.2.2 只執(zhí)行一次的Once 75
3.2.3 請(qǐng)求合并的SingleFlight76
3.3 協(xié)程安全的數(shù)據(jù)結(jié)構(gòu)80
3.3.1 讀寫鎖實(shí)現(xiàn)80
3.3.2 分片加鎖實(shí)現(xiàn)81
3.3.3 sync.Map 實(shí)現(xiàn) 83
3.3.4 性能評(píng)測(cè)實(shí)驗(yàn)89
3.4 本章小結(jié) 90
第4 章 Go 語言內(nèi)存分配和垃圾回收機(jī)制
4.1 Linux 內(nèi)存空間布局 91
4.2 Go 語言內(nèi)存分配機(jī)制94
4.2.1 Go 語言內(nèi)存空間的狀態(tài)機(jī) 95
4.2.2 內(nèi)存管理單元mspan 96
4.2.3 內(nèi)存線程緩存mcache 98
4.2.4 內(nèi)存中心緩存mcentral 99
4.2.5 頁堆mheap 100
4.2.6 內(nèi)存分配函數(shù)newObject 101
4.2.7 各級(jí)內(nèi)存組件功能的實(shí)現(xiàn) 106
4.2.8 實(shí)驗(yàn):打印內(nèi)存分配相關(guān)日志 119
4.3 Go 語言垃圾回收機(jī)制120
4.3.1 Go 語言垃圾回收的基礎(chǔ)原理 120
4.3.2 Go 語言垃圾回收流程 124
4.3.3 垃圾回收觸發(fā)時(shí)機(jī)125
4.3.4 清理終止階段和開啟標(biāo)記階段 129
4.3.5 標(biāo)記階段132
4.3.6 標(biāo)記終止階段150
4.3.7 內(nèi)存清理152
4.4 本章小結(jié) 155
第5 章 Go 語言協(xié)程
5.1 進(jìn)程與線程 156
5.1.1 進(jìn)程和線程的概念156
5.1.2 進(jìn)程與線程的區(qū)別160
5.1.3 并發(fā)與并行161
5.2 協(xié)程的誕生 162
5.2.1 協(xié)程誕生的背景162
5.2.2 協(xié)程的工作機(jī)制和優(yōu)勢(shì) 162
5.2.3 協(xié)程、線程、進(jìn)程的差異 164
5.3 Go 語言的調(diào)度器goroutine164
5.3.1 Go context 上下文164
5.3.2 Go 語言并發(fā)模型169
5.3.3 Go 調(diào)度模型概覽170
5.3.4 調(diào)度器的實(shí)現(xiàn)原理173
5.4 Go 語言運(yùn)行時(shí)的系統(tǒng)監(jiān)控179
5.4.1 監(jiān)控循環(huán)與死鎖檢查180
5.5 goroutine 之間的通信:channel 182
5.5.1 channel 的設(shè)計(jì)與結(jié)構(gòu)183
5.5.2 channel 的使用 185
5.5.3 解決channel 阻塞:select 189
5.5.4 goroutine 與channel 的結(jié)合案例 192
5.5.5 并發(fā)問題是選Mutex 還是選channel 194
5.6 本章小結(jié):goroutine 是銀彈嗎195
第6 章 Go 語言網(wǎng)絡(luò)并發(fā)處理
6.1 網(wǎng)絡(luò)并發(fā)處理的演變196
6.1.1 程序設(shè)計(jì)導(dǎo)致的C10K 問題 197
6.1.2 操作系統(tǒng)調(diào)優(yōu)的C1000K 問題 200
6.1.3 更進(jìn)一步的C10M 問題201
6.2 Reactor 請(qǐng)求處理模式202
6.2.1 Reactor 模式簡(jiǎn)介 202
6.2.2 Getty 網(wǎng)絡(luò)庫介紹207
6.3 HTTP 請(qǐng)求處理 212
iv 深入Go 語言:原理、關(guān)鍵技術(shù)與實(shí)戰(zhàn)
6.3.1 net/http 包解析 213
6.3.2 Go Fasthttp 解析217
6.4 本章小結(jié) 225
第7 章 Go 語言錯(cuò)誤處理機(jī)制
7.1 代碼中的錯(cuò)誤與異常226
7.2 Go 語言的錯(cuò)誤處理哲學(xué):Errors are values 227
7.2.1 error 接口227
7.2.2 對(duì)error 進(jìn)行編程230
7.3 處理異常并恢復(fù)230
7.3.1 基本使用方式230
7.3.2 defer 延時(shí)執(zhí)行的實(shí)現(xiàn)原理 234
7.3.3 panic 終止程序和recover 從panic 中恢復(fù)的原理 248
7.4 本章小結(jié) 252
第8 章 Go 語言的類型系統(tǒng)
8.1 編程語言類型系統(tǒng)簡(jiǎn)介253
8.1.1 用戶自定義類型254
8.1.2 抽象數(shù)據(jù)類型257
8.1.3 面向?qū)ο缶幊?58
8.2 Go 語言類型底層實(shí)現(xiàn)265
8.2.1 Go 語言結(jié)構(gòu)體底層實(shí)現(xiàn) 265
8.2.2 嵌入底層實(shí)現(xiàn)271
8.2.3 接口底層實(shí)現(xiàn)273
8.2.4 接口函數(shù)調(diào)用和動(dòng)態(tài)派發(fā) 278
8.3 本章小結(jié) 280
第9 章 Go 語言的泛型和反射
9.1 Go 語言的泛型281
9.1.1 Go 語言泛型基礎(chǔ)理念 281
9.1.2 泛型的必要性282
9.2 Go 語言的泛型特性283
9.2.1 Go 語言泛型的理念 284
9.2.2 Go 語言泛型語法284
9.2.3 Go 語言泛型的實(shí)現(xiàn) 287
9.3 Go 語言反射機(jī)制290
9.3.1 Go 語言反射技術(shù)簡(jiǎn)介 291
9.3.2 Go 語言反射使用 292
9.4 Go 語言反射實(shí)現(xiàn)300
9.4.1 獲取反射對(duì)象301
9.4.2 更新變量304
9.4.3 調(diào)用函數(shù)305
9.5 本章小結(jié) 308
第10 章 Go 語言工程化實(shí)踐
10.1 日志 309
10.1.1 日志級(jí)別309
10.1.2 日志格式310
10.1.3 日志框架311
10.2 代碼測(cè)試 329
10.2.1 單元測(cè)試330
10.2.2 基準(zhǔn)測(cè)試333
10.3 Go 語言調(diào)試339
10.3.1 GDB 調(diào)試 340
10.3.2 使用Delve 進(jìn)行調(diào)試 343
10.4 Go 語言性能分析347
10.4.1 普通應(yīng)用程序的性能分析 348
10.4.2 后臺(tái)服務(wù)程序的性能分析 352
10.4.3 利用go-torch 生成火焰圖 357
10.4 本章小結(jié) 359
第11 章 etcd 存儲(chǔ)原理與機(jī)制
11.1 etcd 整體架構(gòu)360
11.1.1 etcd 項(xiàng)目結(jié)構(gòu)360
11.1.2 etcd 整體架構(gòu) 362
11.2 etcd 交互總覽363
11.3 讀/寫請(qǐng)求的處理過程 367
11.3.1 讀操作的過程367
11.3.2 寫操作的過程370
11.4 WAL 日志與備份快照372
11.4.1 WAL 日志373
11.4.2 快照備份375
11.4.3 WAL 存儲(chǔ) 377
11.4.4 WAL 日志打開 382
11.4.5 WAL 文件讀取 384
11.5 backend 存儲(chǔ) 387
11.5.1 BoltDB 相關(guān)概念 387
11.5.2 Backend 與BackendTx 接口 388
11.6 本章小結(jié)392
第12 章 如何寫出更好的Go 語言代碼
12.1 Go 語言的最佳實(shí)踐 393
12.1.1 Go 語言風(fēng)格的命名方式 393
12.1.2 相似相近原則395
12.1.3 盡早return 396
12.1.4 善用零值397
12.1.5 結(jié)構(gòu)體嵌入原則398
12.1.6 功能選項(xiàng)Option 399
12.2 Go 語言標(biāo)準(zhǔn)目錄結(jié)構(gòu)401
12.3 Clean Architecture 與DDD 在Go 語言項(xiàng)目中的應(yīng)用404
12.3.1 整潔架構(gòu)404
12.3.2 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)406
12.4 綜合案例:貨運(yùn)業(yè)務(wù)項(xiàng)目407
12.4.1 項(xiàng)目需求分析408
12.4.2 項(xiàng)目目錄結(jié)構(gòu)410
12.4.3 具體實(shí)現(xiàn)411
12.5 本章小結(jié) 416
