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

白明(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語言的誕生與演進2
1.1 Go語言的誕生2
1.2 Go語言的早期團隊和演進歷程4
1.3 Go語言正式發布並開源4
第2條 選擇適當的Go語言版本6
2.1 Go語言的先祖6
2.2 Go語言的版本發布歷史7
2.3 Go語言的版本選擇建議11
第3條 理解Go語言的設計哲學12
3.1 追求簡單,少即是多12
3.2 偏好組合,正交解耦15
3.3 原生並發,輕量高效17
3.4 面向工程,“自帶電池”21
第4條 使用Go語言原生編程思維來寫Go代碼26
4.1 語言與思維—來自大師的觀點26
4.2 現實中的“投影”27
4.3 Go語言原生編程思維29
第二部分 項目結構、代碼風格與標識符命名
第5條 使用得到公認且廣泛使用的項目結構32
5.1 Go項目的項目結構32
5.2 Go語言典型項目結構35
第6條 提交前使用gofmt格式化源碼40
6.1 gofmt:Go語言在解決規模化問題上的最佳實踐40
6.2 使用gofmt41
6.3 使用goimports43
6.4 將gofmt/goimports與IDE或編輯器工具集成44
第7條 使用Go命名慣例對標識符進行命名47
7.1 簡單且一致48
7.2 利用上下文環境,讓最短的名字攜帶足夠多的信息53
第三部分 聲明、類型、語句與
控制結構
第8條 使用一致的變量聲明形式56
8.1 包級變量的聲明形式56
8.2 局部變量的聲明形式59
第9條 使用無類型常量簡化代碼63
9.1 Go常量溯源63
9.2 有類型常量帶來的煩惱64
9.3 無類型常量消除煩惱,簡化代碼65
第10條 使用iota實現枚舉常量68
第11條 盡量定義零值可用的類型73
11.1 Go類型的零值73
11.2 零值可用75
第12條 使用複合字面值作為初值構造器78
12.1 結構體複合字面值79
12.2 數組/切片複合字面值80
12.3 map複合字面值81
第13條 了解切片實現原理並高效使用83
13.1 切片究竟是什麼83
13.2 切片的高級特性:動態擴容87
13.3 盡量使用cap參數創建切片90
第14條 了解map實現原理並高效使用92
14.1 什麼是map92
14.2 map的基本操作93
14.3 map的內部實現97
14.4 盡量使用cap參數創建map103
第15條 了解string實現原理並高效使用105
15.1 Go語言的字符串類型105
15.2 字符串的內部表示110
15.3 字符串的高效構造112
15.4 字符串相關的高效轉換115
第16條 理解Go語言的包導入120
16.1 Go程序構建過程121
16.2 究竟是路徑名還是包名127
16.3 包名衝突問題130
第17條 理解Go語言表達式的求值順序132
17.1 包級別變量聲明語句中的表達式求值順序133
17.2 普通求值順序136
17.3 賦值語句的求值139
17.4 switch/select語句中的表達式求值140
第18條 理解Go語言代碼塊與作用域143
18.1 Go代碼塊與作用域簡介143
18.2 if條件控制語句的代碼塊145
18.3 其他控制語句的代碼塊規則簡介148
第19條 了解Go語言控制語句慣用法及使用注意事項154
19.1 使用if控制語句時應遵循“快樂路徑”原則154
19.2 for range的避“坑”指南156
19.3 break跳到哪裡去了165
19.4 盡量用case表達式列表替代fallthrough167
第四部分 函數與方法
第20條 在init函數中檢查包級變量的初始狀態170
20.1 認識init函數170
20.2 程序初始化順序171
20.3 使用init函數檢查包級變量的初始狀態174
第21條 讓自己習慣於函數是“一等公民”179
21.1 什麼是“一等公民”179
21.2 函數作為“一等公民”的特殊運用183
第22條 使用defer讓函數更簡潔、更健壯192
22.1 defer的運作機制193
22.2 defer的常見用法194
22.3 關於defer的幾個關鍵問題199
第23條 理解方法的本質以選擇
正確的receiver類型206
23.1 方法的本質207
23.2 選擇正確的receiver類型208
23.3 基於對Go方法本質的理解巧解難題210
第24條 方法集合決定接口實現214
24.1 方法集合215
24.2 類型嵌入與方法集合216
24.3 defined類型的方法集合226
24.4 類型別名的方法集合227
第25條 了解變長參數函數的妙用230
25.1 什麼是變長參數函數230
25.2 模擬函數重載233
25.3 模擬實現函數的可選參數與默認參數236
25.4 實現功能選項模式238
第五部分 接口
第26條 了解接口類型變量的內部表示246
26.1 nil error值 != nil247
26.2 接口類型變量的內部表示248
26.3 輸出接口類型變量內部表示的詳細信息254
26.4 接口類型的裝箱原理258
第27條 盡量定義小接口263
27.1 Go推薦定義小接口263
27.2 小接口的優勢265
27.3 定義小接口可以遵循的一些點267
第28條 盡量避免使用空接口作為函數參數類型270
第29條 使用接口作為程序水平組合的連接點274
29.1 一切皆組合274
29.2 垂直組合回顧275
29.3 以接口為連接點的水平組合276
第30條 使用接口提高代碼的可測試性281
30.1 實現一個附加免責聲明的電子郵件發送函數282
30.2 使用接口來降低耦合283
第六部分 並發編程
第31條 優先考慮並發設計288
31.1 並發與並行288
31.2 Go並發設計實例290
第32條 了解goroutine的調度原理299
32.1 goroutine調度器299