Go 語言精進之路:從新手到高手的編程思想、方法和技巧 2

白明(Tony Bai) 

買這商品的人也買了...

商品描述

Go入門容易,精進難,如何才能像Go開發團隊那樣寫出符合Go思維和語言慣例的高質量代碼呢?
本書將從編程思維和實踐技巧2個維度給出答案,
幫助你在Go進階的路上事半功倍。
編程思維層面
只有真正領悟了一門語言的設計哲學和編程思維,並能將之用於實踐,才算精通了這門語言。
本書從Go語言設計者的視角對Go背後的設計哲學和編程思想進行了梳理和分析,
指引讀者體會那些看似隨意實則經過深思熟慮的設計背後的秘密。
實踐技巧層面
實踐技巧源於對Go開發團隊和Go社區開發的高質量代碼的閱讀、
挖掘和歸納,從項目結構、代碼風格、語法及其實現、接口、並發、
同步、錯誤與異常處理、測試與調試、性能優化、標準庫、
第三方庫、工具鏈、Z佳實踐、工程實踐等多個方面給出了改善Go代碼質量、寫出符合 Go 思維和慣例的代碼的有效實踐。
全書的內容覆蓋如下10個大類,共66個主題,字字珠璣,句句箴言。
(1)Go語言的一切
(2)項目結構、代碼風格與標識符命名
(3)聲明、類型、語句與控制結構
(4)函數與方法
(5)接口
(6)並發編程
(7)錯誤處理
(8)測試、性能剖析與調試
(9)標準庫、反射與cgo
(10)工具鏈與工程實踐
學完這本書,你將擁有和 Go專家一樣的編程思維,寫出符合Go慣例和風格的高質量代碼,
從眾多 Go 初學者中脫穎而出,快速實現從Go新手到專家的轉變!

作者簡介

白明(Tony Bai) 

資深Go技術專家和架構師,有超過10年的服務端架構設計和開發經驗,擅長服務器後端編程。
曾任東軟集團開發部技術總監和東網科技高級架構師,
現為東軟睿馳智能網聯汽車業務線精通車聯網平台的高級架構師。
精通Go、C、Python、Shell、Linux、Rancher、Docker、OpenStack、Kubernetes等技術棧。
《七週七語言》譯者之一,GopherChina大會、開源中國源創會講師,
麥思博客座培訓師,tonybai.com技術博客博主。

目錄大綱

推薦序
前言
一部分 熟知Go語言的一切
1條 了解Go語言的誕生與演進
1.1 Go語言的誕生
1.2 Go語言的早期團隊和演進歷程
1.3 Go語言正式發布並開源
2條 選擇適當的Go語言版本
2.1 Go語言的先祖
2.2 Go語言的版本發布歷史
2.3 Go語言的版本選擇建議
3條 理解Go語言的設計哲學
3.1 追求簡單,少即是多
3.2 偏好組合,正交解耦
3.3 原生並發,輕量高效
3.4 面向工程,“自帶電池”
4條 使用Go語言原生編程思維來寫Go代碼
4.1 語言與思維—來自大師的觀點
4.2 現實中的“投影”
4.3 Go語言原生編程思維
二部分 項目結構、代碼風格與標識符命名
5條 使用得到公認且廣泛使用的項目結構
5.1 Go項目的項目結構
5.2 Go語言典型項目結構
6條 提交前使用gofmt格式化源碼
6.1 gofmt:Go語言在解決規模化問題上的佳實踐
6.2 使用gofmt
6.3 使用goimports
6.4 將gofmt/goimports與IDE或編輯器工具集成
7條 使用Go命名慣例對標識符進行命名
7.1 簡單且一致
7.2 利用上下文環境,讓短的名字
攜帶足夠多的信息
三部分 聲明、類型、語句與
控制結構
8條 使用一致的變量聲明形式
8.1 包級變量的聲明形式
8.2 局部變量的聲明形式
9條 使用無類型常量簡化代碼
9.1 Go常量溯源
9.2 有類型常量帶來的煩惱
9.3 無類型常量消除煩惱,簡化代碼
10條 使用iota實現枚舉常量
11條 盡量定義零值可用的類型
11.1 Go類型的零值
11.2 零值可用
12條 使用複合字面值作為初值構造器
12.1 結構體複合字面值
12.2 數組/切片複合字面值
12.3 map複合字面值
13條 了解切片實現原理並高效使用
13.1 切片究竟是什麼
13.2 切片的高級特性:動態擴容
13.3 盡量使用cap參數創建切片
14條 了解map實現原理並高效使用
14.1 什麼是map
14.2 map的基本作
14.3 map的內部實現
14.4 盡量使用cap參數創建map
15條 了解string實現原理並高效使用
15.1 Go語言的字符串類型
15.2 字符串的內部表示
15.3 字符串的高效構造
15.4 字符串相關的高效轉換
16條 理解Go語言的包導入
16.1 Go程序構建過程
16.2 究竟是路徑名還是包名
16.3 包名衝突問題
17條 理解Go語言表達式的求值順序
17.1 包級別變量聲明語句中的表達式求值順序
17.2 普通求值順序
17.3 賦值語句的求值
17.4 switch/select語句中的表達式求值
18條 理解Go語言代碼塊與作用域
18.1 Go代碼塊與作用域簡介
18.2 if條件控制語句的代碼塊
18.3 其他控制語句的代碼塊規則簡介
19條 了解Go語言控制語句慣用法及使用注意事項
19.1 使用if控制語句時應遵循“快樂路徑”原則
19.2 for range的避“坑”指南
19.3 break跳到哪裡去了
19.4 盡量用case表達式列表替代fallthrough
部分 函數與方法
20條 在init函數中檢查包級變量的初始狀態
20.1 認識init函數
20.2 程序初始化順序
20.3 使用init函數檢查包級變量的初始狀態
21條 讓自己習慣於函數是“一等公民”
21.1 什麼是“一等公民”
21.2 函數作為“一等公民”的特殊運用
22條 使用defer讓函數更簡潔、更健壯
22.1 defer的運作機制
22.2 defer的常見用法
22.3 關於defer的幾個關鍵問題
23條 理解方法的本質以選擇正確的receiver類型
23.1 方法的本質
23.2 選擇正確的receiver類型
23.3 基於對Go方法本質的理解巧解難題
24條 方法集合決定接口實現
24.1 方法集合
24.2 類型嵌入與方法集合
24.3 defined類型的方法集合
24.4 類型別名的方法集合
25條 了解變長參數函數的妙用
25.1 什麼是變長參數函數
25.2 模擬函數重載
25.3 模擬實現函數的可選參數與默認參數
25.4 實現功能選項模式
五部分 接口
26條 了解接口類型變量的內部表示
26.1 nil error值 != nil
26.2 接口類型變量的內部表示
26.3 輸出接口類型變量內部表示的詳細信息
26.4 接口類型的裝箱原理
27條 盡量定義小接口
27.1 Go推薦定義小接口
27.2 小接口的優勢
27.3 定義小接口可以遵循的一些點
28條 盡量避免使用空接口作為函數參數類型
29條 使用接口作為程序水平組合的連接點
29.1 一切皆組合
29.2 垂直組合回顧
29.3 以接口為連接點的水平組合
30條 使用接口提高代碼的可測試性
30.1 實現一個附加免責聲明的電子郵件發送函數
30.2 使用接口來降低耦合
六部分 並發編程
31條 優先考慮並發設計
31.1 並發與並行
31.2 Go並發設計實例
32條 了解goroutine的調度原理
32.1 goroutine調度器
32.2 goroutine調度模型與演進過程
32.3 對goroutine調度器原理的進一步理解
32.4 調度器狀態的查看方法
32.5 goroutine調度實例簡要分析
33條 掌握Go並發模型和常見並發模式
33.1 Go並發模型
33.2 Go常見的並發模式
34條 了解channel的妙用
34.1 無緩衝channel
34.2 帶緩衝channel
34.3 nil channel的妙用
34.4 與select結合使用的一些慣用法
35條 了解sync包的正確用法
35.1 sync包還是channel
35.2 使用sync包的注意事項
35.3 互斥鎖還是讀寫鎖
35.4 條件變量
35.5 使用sync.Once實現單例模式
35.6 使用sync.Pool減輕垃圾回收壓力
36條 使用atomic包實現伸縮性更好的並發讀取
36.1 atomic包與原子作
36.2 對共享整型變量的無鎖讀寫
36.3 對共享自定義類型變量的無鎖讀寫
七部分 錯誤處理
37條 了解錯誤處理的4種策略
37.1 構造錯誤值
37.2 透明錯誤處理策略
37.3 “哨兵”錯誤處理策略
37.4 錯誤值類型檢視策略
37.5 錯誤行為特徵檢視策略
38條 盡量優化反復出現的if err != nil
38.1 兩種觀點
38.2 盡量優化
38.3 優化思路
39條 不要使用panic進行正常的錯誤處理
39.1 Go的panic不是Java的checked eception
39.2 panic的典型應用
39.3 理解panic的輸出信息
(以上為1冊內容,以下為本書內容。)
八部分 測試、性能剖析與調試
40條 理解包內測試與包外測試的差別2
40.1 官方文檔的“自相矛盾”2
40.2 包內測試與包外測試3
41條 有層次地組織測試代碼9
41.1 經典模式—平鋪9
41.2 Unit家族模式10
41.3 測試固件13
42條 優先編寫表驅動的測試20
42.1 Go測試代碼的一般邏輯20
42.2 表驅動的測試實踐21
42.3 表驅動測試的優點22
42.4 表驅動測試實踐中的注意事項23
43條 使用testdata管理測試依賴的外部數據文件28
43.1 testdata目錄28
43.2 golden文件慣用法32
44條 正確運用fake、stub和mock等輔助單元測試35
44.1 fake:真實組件或服務的簡化實現版替身36
44.2 stub:對返回結果有一定預設控制能力的替身39
44.3 mock:專用於行為觀察和驗證的替身44
45條 使用模糊測試讓潛在bug無處遁形48
45.1 模糊測試在挖掘Go代碼的潛在bug中的作用49
45.2 go-fuzz的初步工作原理49
45.3 go-fuzz使用方法51
45.4 使用go-fuzz建立模糊測試的示例54
45.5 讓模糊測試成為“一等公民”58
46條 為被測對象建立性能基準60
46.1 性能基準測試在Go語言中是“一等公民”60
46.2 順序執行和並行執行的性能基準測試62
46.3 使用性能基準比較工具69
46.4 排除額外干擾,讓基準測試更精確72
47條 使用pprof對程序進行性能剖析76
47.1 pprof的工作原理76
47.2 使用pprof進行性能剖析的實例90
48條 使用epvar輸出度量數據,輔助定位性能瓶頸點101
48.1 epvar包的工作原理102
48.2 自定義應用通過epvar輸出的度量數據105
48.3 輸出數據的展示110
49條 使用Delve調試Go代碼112
49.1 關於調試,你首先應該知道的幾件事112
49.2 Go調試工具的選擇114
49.3 Delve調試基礎、原理與架構116
49.4 並發、Coredump文件與掛接進程調試125
九部分 標準庫、反與cgo
50條 理解Go TCP Socket網絡編程模型136
50.1 TCP Socket網絡編程模型137
50.2 TCP連接的建立142
50.3 Socket讀寫145
50.4 Socket屬性155
50.5 關閉連接156
51條 使用net/***包實現安全通信158
51.1 HTTPS:在安全傳輸層上運行的HTTP協議158
51.2 HTTPS安全傳輸層的工作機制161
51.3 非對稱加密和公鑰證書164
51.4 對服務端公鑰證書的校驗169
51.5 對客戶端公鑰證書的校驗172
52條 掌握字符集的原理和字符編碼方案間的轉換175
52.1 字符與字符集175
52.2 Unicode字符集的誕生與UTF-8編碼方案177
52.3 字符編碼方案間的轉換179
53條 掌握使用time包的正確方式187
53.1 時間的基礎作187
53.2 時間的格式化輸出196
53.3 定時器的使用199
54條 不要忽略對系統信號的處理209
54.1 為什麼不能忽略對系統信號的處理209
54.2 Go語言對系統信號處理的支持210
54.3 使用系統信號實現程序的優雅出216
55條 使用crypto下的密碼學包構建安全應用219
55.1 Go密碼學包概覽與設計原則219
55.2 分組密碼算法221
55.3 公鑰密碼228
55.4 單向散列函數231
55.5 消息認證碼233
55.6 數字簽名235
55.7 隨機數生成238
56條 掌握bytes包和strings包的基本作240
56.1 查找與替換241
56.2 比較244
56.3 分割246
56.4 拼接248
56.5 修剪與變換249
56.6 快速對接I/O模型252
57條 理解標準庫的讀寫模型254
57.1 直接讀寫字節序列255
57.2 直接讀寫抽像數據類型實例257
57.3 通過包裹類型讀寫數據263
58條 掌握unsafe包的安全使用模式269
58.1 簡潔的unsafe包 270
58.2 unsafe包的典型應用273
58.3 正確理解unsafe.Pointer與uintptr277
58.4 unsafe.Pointer的安全使用模式280
59條 謹慎使用reflect包提供的反能力288
59.1 Go反的三大法則288
59.2 反世界的入口291
59.3 反世界的出口295
59.4 輸出參數、interface{}類型變量及反對象的可設置性295
60條 了解cgo的原理和使用開銷300
60.1 Go調用C代碼的原理300
60.2 在Go中使用C語言的類型302
60.3 在Go中***外部C庫307
60.4 在C中使用Go函數309
60.5 使用cgo的開銷309
60.6 使用cgo代碼的靜態構建314
十部分 工具鏈與工程實踐
61條 使用module管理包依賴320
61.1 Go語言包管理演進回顧320
61.2 Go module:Go包依賴管理的生產標準324
61.3 Go module代理339
61.4 升級module的主版本號342
62條 構建小Go程序容器鏡像350
62.1 鏡像:繼承中的創新350
62.2 “鏡像是個筐”:初學者的認知351
62.3 理性回歸:builder模式的崛起353
62.4 “像賽車那樣減重”:追求小鏡像355
62.5 “要有光”:對多階段構建的支持357
63條 自定義Go包的導入路徑359
63.1 govanityurls360
63.2 使用govanityurls361
64條 熟練掌握Go常用工具367
64.1 獲取與安裝367
64.2 包或module檢視373
64.3 構建380
64.4 運行與診斷390
64.5 格式化與靜態代碼檢查398
64.6 重構402
64.7 查看文檔412
64.8 代碼導航與洞察419
65條 使用go generate驅動代碼生成421
65.1 go generate:Go原生的代碼生成“驅動器”421
65.2 go generate的工作原理423
65.3 go generate的應用場景425
66條 牢記Go的常見“陷阱”430
66.1 語法規範類431
66.2 標準庫類455