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