【前言】
【為什么要寫本書 】Go是Google三位大師級(jí)人物Robert Griesemer、Rob Pike及Ken Thompson共同設(shè)計(jì)的一種靜態(tài)類型、編譯型編程語(yǔ)言。它于2009年11月正式開源,一經(jīng)面世就憑借語(yǔ)法簡(jiǎn)單、原生支持并發(fā)、標(biāo)準(zhǔn)庫(kù)強(qiáng)大、工具鏈豐富等優(yōu)點(diǎn)吸引了大量開發(fā)者。經(jīng)過十余年演進(jìn)和發(fā)展,Go如今已成為主流云原生編程語(yǔ)言,很多云原生時(shí)代的殺手級(jí)平臺(tái)、中間件、協(xié)議和應(yīng)用都是采用Go語(yǔ)言開發(fā)的,比如Docker、Kubernetes、以太坊、Hyperledger Fabric超級(jí)賬本、新一代互聯(lián)網(wǎng)基礎(chǔ)設(shè)施協(xié)議IPFS等。
Go是一門特別容易入門的編程語(yǔ)言,無(wú)論是剛出校門的新手還是從其他編程語(yǔ)言轉(zhuǎn)過來的老手,都可以在短時(shí)間內(nèi)快速掌握Go語(yǔ)法并編寫Go代碼。但很多Go初學(xué)者的疑問是:Go入門容易,但精進(jìn)難,怎么才能像Go開發(fā)團(tuán)隊(duì)那樣寫出符合Go思維和語(yǔ)言慣例的高質(zhì)量代碼呢?這個(gè)問題引發(fā)了我的思考。在2017年GopherChina大會(huì)上,我以演講的形式初次嘗試回答這個(gè)問題,但鑒于演講的時(shí)長(zhǎng)有限,很多內(nèi)容沒能展開,效果不甚理想。而本書正是我對(duì)解答這個(gè)問題所做出的第二次嘗試。
我這次解答的思路有兩個(gè)。
思維層面:寫出高質(zhì)量Go代碼的前提是思維方式的進(jìn)階,即用Go語(yǔ)言的思維寫Go代碼。
實(shí)踐技巧層面:Go標(biāo)準(zhǔn)庫(kù)和優(yōu)秀Go開源庫(kù)是挖掘符合Go慣用法的高質(zhì)量Go代碼的寶庫(kù),對(duì)其進(jìn)行閱讀、整理和歸納,可以得到一些能夠幫助我們快速進(jìn)階的有效實(shí)踐。
本書正是基于以上思路為想實(shí)現(xiàn)Go精進(jìn)但又不知從何入手的你而寫的。
首屆圖靈獎(jiǎng)得主、著名計(jì)算機(jī)科學(xué)家Alan J. Perlis曾說過:不能影響到你的編程思維方式的編程語(yǔ)言不值得學(xué)習(xí)和使用。由此可見編程思維對(duì)編程語(yǔ)言學(xué)習(xí)和應(yīng)用的重要性。只有真正領(lǐng)悟了一門編程語(yǔ)言的設(shè)計(jì)哲學(xué)和編程思維,并將其應(yīng)用到日常編程當(dāng)中,你才算真正精通了這門編程語(yǔ)言。
因此,本書將首先帶領(lǐng)大家回顧Go語(yǔ)言的演進(jìn)歷程,一起了解Go語(yǔ)言設(shè)計(jì)者在設(shè)計(jì)Go語(yǔ)言時(shí)的所思所想,與他們產(chǎn)生思維上的共鳴,深刻體會(huì)那些看似隨意實(shí)則經(jīng)過深思熟慮的設(shè)計(jì)。
接下來,本書將基于對(duì)Go開發(fā)團(tuán)隊(duì)、Go社區(qū)高質(zhì)量代碼的分析與歸納,從項(xiàng)目結(jié)構(gòu)和代碼風(fēng)格、基礎(chǔ)語(yǔ)法、函數(shù)、方法、接口、并發(fā)、錯(cuò)誤處理、測(cè)試與性能優(yōu)化、標(biāo)準(zhǔn)庫(kù)、工具鏈等多個(gè)方面,給出改善Go代碼質(zhì)量、寫出符合Go思維和慣例的代碼的箴言。
學(xué)習(xí)了本書中的這些箴言,你將擁有和Go專家一樣的Go編程思維,寫出符合Go慣例風(fēng)格的高質(zhì)量Go代碼,從眾多Go初學(xué)者中脫穎而出,快速實(shí)現(xiàn)從Go編程新手到專家的轉(zhuǎn)變!
【讀者對(duì)象】
本書主要適合以下人員閱讀:
迫切希望在Go語(yǔ)言上精進(jìn)并上升到新層次的Go語(yǔ)言初學(xué)者;
希望寫出更符合Go慣用法的高質(zhì)量代碼的Go語(yǔ)言開發(fā)者;
有Go語(yǔ)言面試需求的在校生或Go語(yǔ)言求職者;
已掌握其他編程語(yǔ)言且希望深入學(xué)習(xí)Go語(yǔ)言的開發(fā)者。
【本書特色】
本書的特色可以概括為以下幾點(diǎn)。
進(jìn)階:精心總結(jié)的編程箴言助你掌握高效Go程序設(shè)計(jì)之道。
高屋建瓴:Go設(shè)計(jì)哲學(xué)與編程思想先行。
深入淺出:原理深入,例子簡(jiǎn)明,講解透徹。
圖文并茂:大量圖表輔助學(xué)習(xí),重點(diǎn)、難點(diǎn)輕松掌控。
【如何閱讀本書】
本書內(nèi)容共分為十部分,限于篇幅,分為兩冊(cè)出版,即《Go語(yǔ)言精進(jìn)之路:從新手到高手的編程思想、方法和技巧1》和《Go語(yǔ)言精進(jìn)之路:從新手到高手的編程思想、方法和技巧2》。
其中,第1冊(cè)包含第1~7部分(請(qǐng)購(gòu)買第1冊(cè)),
第2冊(cè)包含第8~10部分(本書)
第1部分 熟知Go語(yǔ)言的一切
本部分將帶領(lǐng)讀者穿越時(shí)空,回顧歷史,詳細(xì)了解Go語(yǔ)言的誕生、演進(jìn)以及發(fā)展現(xiàn)狀。通過歸納總結(jié)Go語(yǔ)言的設(shè)計(jì)哲學(xué)和原生編程思維,讓讀者站在語(yǔ)言設(shè)計(jì)者的高度理解Go語(yǔ)言與眾不同的設(shè)計(jì),認(rèn)同Go語(yǔ)言的設(shè)計(jì)理念。
第二部分 項(xiàng)目結(jié)構(gòu)、代碼風(fēng)格與標(biāo)識(shí)符命名
每種編程語(yǔ)言都有自己慣用的代碼風(fēng)格,而遵循語(yǔ)言慣用風(fēng)格是編寫高質(zhì)量Go代碼的必要條件。本部分詳細(xì)介紹了得到公認(rèn)且廣泛使用的Go項(xiàng)目的結(jié)構(gòu)布局、代碼風(fēng)格標(biāo)準(zhǔn)、標(biāo)識(shí)符命名慣例等。
第三部分 聲明、類型、語(yǔ)句與控制結(jié)構(gòu)
本部分詳述基礎(chǔ)語(yǔ)法層面高質(zhì)量Go代碼的慣用法和有效實(shí)踐,涵蓋無(wú)類型常量的作用、定義Go的枚舉常量、零值可用類型的意義、切片原理以及高效的原因、Go包導(dǎo)入路徑的真正含義等。
第四部分 函數(shù)與方法
函數(shù)和方法是Go程序的基本組成單元。本部分聚焦于函數(shù)與方法的設(shè)計(jì)和實(shí)現(xiàn),涵蓋init函數(shù)的使用、躋身一等公民行列的函數(shù)有何不同、Go方法的本質(zhì)等。
第五部分 接口
接口是Go語(yǔ)言中的魔法師。本部分聚焦于接口,涵蓋接口的設(shè)計(jì)慣例、使用接口類型的注意事項(xiàng)以及接口類型對(duì)代碼可測(cè)試性的影響等。
第六部分 并發(fā)編程
Go以其輕量級(jí)的并發(fā)模型而聞名。本部分詳細(xì)介紹Go基本執(zhí)行單元goroutine的調(diào)度原理、Go并發(fā)模型以及常見并發(fā)模式、Go支持并發(fā)的原生類型channel的慣用模式等內(nèi)容。
第七部分 錯(cuò)誤處理
Go語(yǔ)言十分重視錯(cuò)誤處理,它有著相對(duì)保守的設(shè)計(jì)和顯式處理錯(cuò)誤的慣例。本部分涵蓋Go錯(cuò)誤處理的哲學(xué)以及在這套哲學(xué)下一些常見錯(cuò)誤處理問題的優(yōu)秀實(shí)踐。
(以上第1~7部分內(nèi)容為第1冊(cè)內(nèi)容)
----------------------------------------------
(以下第8~10部分內(nèi)容,為本購(gòu)買鏈接<第2冊(cè)>內(nèi)容)
第八部分 測(cè)試、性能剖析與調(diào)試
Go自帶強(qiáng)大且為人所稱道的工具鏈。本部分詳細(xì)介紹Go在單元測(cè)試、性能基準(zhǔn)測(cè)試與性能剖析以及代碼調(diào)試方面的實(shí)踐。
第九部分 標(biāo)準(zhǔn)庫(kù)、反射與cgo
Go擁有功能強(qiáng)大且質(zhì)量上乘的標(biāo)準(zhǔn)庫(kù),在多數(shù)情況下僅使用標(biāo)準(zhǔn)庫(kù)即可實(shí)現(xiàn)應(yīng)用的大部分功能,這大幅降低了學(xué)習(xí)成本以及代碼依賴的管理成本。本部分詳細(xì)說明高頻使用的標(biāo)準(zhǔn)庫(kù)包(如net/http、strings、bytes、time等)的正確使用方式,以及在使用reflect包、cgo時(shí)的注意事項(xiàng)。
第十部分 工具鏈與工程實(shí)踐
本部分涵蓋在使用Go語(yǔ)言進(jìn)行大型軟件項(xiàng)目開發(fā)的過程中,我們很有可能會(huì)遇到的一些工程問題的解決方法,包括使用go module進(jìn)行Go包依賴管理、Go程序容器鏡像、Go相關(guān)工具使用以及Go語(yǔ)言的避坑指南。
書中的源文件可以從https://github.com/bigwhite/GoProgrammingFromBeginnerToMaster下載
【本書分1、2兩冊(cè)。此鏈接為第2冊(cè),包含第8~10部分內(nèi)容】
第1~7部分內(nèi)容,請(qǐng)進(jìn)本書第1冊(cè)鏈接單獨(dú)購(gòu)買
----------------------------------------
【以下為本書(第2冊(cè))內(nèi)容】
●第八部分 測(cè)試、性能剖析與調(diào)試
第40條 理解包內(nèi)測(cè)試與包外測(cè)試的差別
40.1 官方文檔的自相矛盾
40.2 包內(nèi)測(cè)試與包外測(cè)試
第41條 有層次地組織測(cè)試代碼
41.1 經(jīng)典模式平鋪
41.2 xUnit家族模式
41.3 測(cè)試固件
第42條 優(yōu)先編寫表驅(qū)動(dòng)的測(cè)試
42.1 Go測(cè)試代碼的一般邏輯
42.2 表驅(qū)動(dòng)的測(cè)試實(shí)踐
42.3 表驅(qū)動(dòng)測(cè)試的優(yōu)點(diǎn)
42.4 表驅(qū)動(dòng)測(cè)試實(shí)踐中的注意事項(xiàng)
第43條 使用testdata管理測(cè)試依賴的外部數(shù)據(jù)文件
43.1 testdata目錄
43.2 golden文件慣用法
第44條 正確運(yùn)用fake、stub和mock等輔助單元測(cè)試
44.1 fake:真實(shí)組件或服務(wù)的簡(jiǎn)化實(shí)現(xiàn)版替身
44.2 stub:對(duì)返回結(jié)果有一定預(yù)設(shè)控制能力的替身
44.3 mock:專用于行為觀察和驗(yàn)證的替身
第45條 使用模糊測(cè)試讓潛在bug無(wú)處遁形
45.1 模糊測(cè)試在挖掘Go代碼的潛在bug中的作用
45.2 go-fuzz的初步工作原理
45.3 go-fuzz使用方法
45.4 使用go-fuzz建立模糊測(cè)試的示例
45.5 讓模糊測(cè)試成為一等公民
第46條 為被測(cè)對(duì)象建立性能基準(zhǔn)
46.1 性能基準(zhǔn)測(cè)試在Go語(yǔ)言中是一等公民
46.2 順序執(zhí)行和并行執(zhí)行的性能基準(zhǔn)測(cè)試
46.3 使用性能基準(zhǔn)比較工具
46.4 排除額外干擾,讓基準(zhǔn)測(cè)試更精確
第47條 使用pprof對(duì)程序進(jìn)行性能剖析
47.1 pprof的工作原理
47.2 使用pprof進(jìn)行性能剖析的實(shí)例
第48條 使用expvar輸出度量數(shù)據(jù),輔助定位性能瓶頸點(diǎn)
48.1 expvar包的工作原理
48.2 自定義應(yīng)用通過expvar輸出的度量數(shù)據(jù)
48.3 輸出數(shù)據(jù)的展示
第49條 使用Delve調(diào)試Go代碼
49.1 關(guān)于調(diào)試,你首先應(yīng)該知道的幾件事
49.2 Go調(diào)試工具的選擇
49.3 Delve調(diào)試基礎(chǔ)、原理與架構(gòu)
49.4 并發(fā)、Coredump文件與掛接進(jìn)程調(diào)試
●第九部分 標(biāo)準(zhǔn)庫(kù)、反射與cgo
第50條 理解Go TCP Socket網(wǎng)絡(luò)編程模型
50.1 TCP Socket網(wǎng)絡(luò)編程模型
50.2 TCP連接的建立
50.3 Socket讀寫
50.4 Socket屬性
50.5 關(guān)閉連接
第51條 使用net/http包實(shí)現(xiàn)安全通信
51.1 HTTPS:在安全傳輸層上運(yùn)行的HTTP協(xié)議
51.2 HTTPS安全傳輸層的工作機(jī)制
51.3 非對(duì)稱加密和公鑰證書
51.4 對(duì)服務(wù)端公鑰證書的校驗(yàn)
51.5 對(duì)客戶端公鑰證書的校驗(yàn)
第52條 掌握字符集的原理和字符 編碼方案間的轉(zhuǎn)換
52.1 字符與字符集
52.2 Unicode字符集的誕生與UTF-8編碼方案
52.3 字符編碼方案間的轉(zhuǎn)換
第53條 掌握使用time包的正確方式
53.1 時(shí)間的基礎(chǔ)操作
53.2 時(shí)間的格式化輸出
53.3 定時(shí)器的使用
第54條 不要忽略對(duì)系統(tǒng)信號(hào)的處理
54.1 為什么不能忽略對(duì)系統(tǒng)信號(hào)的處理
54.2 Go語(yǔ)言對(duì)系統(tǒng)信號(hào)處理的支持
54.3 使用系統(tǒng)信號(hào)實(shí)現(xiàn)程序的優(yōu)雅退出
第55條 使用crypto下的密碼學(xué)包構(gòu)建安全應(yīng)用
55.1 Go密碼學(xué)包概覽與設(shè)計(jì)原則
55.2 分組密碼算法
55.3 公鑰密碼
55.4 單向散列函數(shù)
55.5 消息認(rèn)證碼
55.6 數(shù)字簽名
55.7 隨機(jī)數(shù)生成
第56條 掌握bytes包和strings包的基本操作
56.1 查找與替換
56.2 比較
56.3 分割
56.4 拼接
56.5 修剪與變換
56.6 快速對(duì)接I/O模型
第57條 理解標(biāo)準(zhǔn)庫(kù)的讀寫模型
57.1 直接讀寫字節(jié)序列
57.2 直接讀寫抽象數(shù)據(jù)類型實(shí)例
57.3 通過包裹類型讀寫數(shù)據(jù)
第58條 掌握unsafe包的安全使用模式
58.1 簡(jiǎn)潔的unsafe包
58.2 unsafe包的典型應(yīng)用
58.3 正確理解unsafe.Pointer與uintptr
58.4 unsafe.Pointer的安全使用模式
第59條 謹(jǐn)慎使用reflect包提供的反射能力
59.1 Go反射的三大法則
59.2 反射世界的入口
59.3 反射世界的出口
59.4 輸出參數(shù)、interface{}類型變量及反射對(duì)象的可設(shè)置性
第60條 了解cgo的原理和使用開銷
60.1 Go調(diào)用C代碼的原理
60.2 在Go中使用C語(yǔ)言的類型
60.3 在Go中鏈接外部C庫(kù)
60.4 在C中使用Go函數(shù)
60.5 使用cgo的開銷
60.6 使用cgo代碼的靜態(tài)構(gòu)建
●第十部分 工具鏈與工程實(shí)踐
第61條 使用module管理包依賴
61.1 Go語(yǔ)言包管理演進(jìn)回顧
61.2 Go module:Go包依賴管理的生產(chǎn)標(biāo)準(zhǔn)
61.3 Go module代理
61.4 升級(jí)module的主版本號(hào)
第62條 構(gòu)建小Go程序容器鏡像
62.1 鏡像:繼承中的創(chuàng)新
62.2 鏡像是個(gè)筐:初學(xué)者的認(rèn)知
62.3 理性回歸:builder模式的崛起
62.4 像賽車那樣減重:追求小鏡像
62.5 要有光:對(duì)多階段構(gòu)建的支持
第63條 自定義Go包的導(dǎo)入路徑
63.1 govanityurls
63.2 使用govanityurls
第64條 熟練掌握Go常用工具
64.1 獲取與安裝
64.2 包或module檢視
64.3 構(gòu)建
64.4 運(yùn)行與診斷
64.5 格式化與靜態(tài)代碼檢查
64.6 重構(gòu)
64.7 查看文檔
64.8 代碼導(dǎo)航與洞察
第65條 使用go generate驅(qū)動(dòng)代碼生成驅(qū)動(dòng)器
65.2 go generate的工作原理
65.3 go generate的應(yīng)用場(chǎng)景
第66條 牢記Go的常見陷阱
66.1 語(yǔ)法規(guī)范類
66.2 標(biāo)準(zhǔn)庫(kù)類
【本購(gòu)買鏈接為第2冊(cè)購(gòu)買鏈接,僅包含以上第8~10部分內(nèi)容】