预购商品
书目分类
特别推荐
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新手到專家的轉變!
第一部分熟知Go語言的一切 第1條瞭解Go語言的誕生與演進2 1.1Go語言的誕生2 1.2Go語言的早期團隊和演進歷程4 1.3Go語言正式發佈並開源4 第2條選擇適當的Go語言版本6 2.1Go語言的先祖6 2.2Go語言的版本發佈歷史7 2.3Go語言的版本選擇建議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.3Go語言原生程式設計思維29 第二部分專案結構、代碼風格與識別字命名 第5條使用得到 且廣泛使用的專案結構32 5.1Go專案的專案結構32 5.2Go語言典型專案結構35 第6條提交前使用gofmt格式化源碼40 6.1gofmt: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.1Go常量溯源63 9.2有類型常量帶來的煩惱64 9.3無類型常量消除煩惱,簡化代碼65 第10條使用iota實現枚舉常量68 第11條儘量定義零值可用的類型73 11.1Go類型的零值73 11.2零值可用75 第12條使用複合字面值作為初值構造器78 12.1結構體複合字面值79 12.2陣列/切片複合字面值80 12.3map複合字面值81 第13條瞭解切片實現原理並高效使用83 13.1切片究竟是什麼83 13.2切片的 特性:動態擴容87 13.3儘量使用cap參數創建切片90 第14條瞭解map實現原理並高效使用92 14.1什麼是map92 14.2map的基本操作93 14.3map的內部實現97 14.4儘量使用cap參數創建map103 第15條瞭解string實現原理並高效使用105 15.1Go語言的字串類型105 15.2字串的內部表示110 15.3字串的高效構造112 15.4字串相關的高效轉換115 第16條理解Go語言的包導入120 16.1Go程式構建過程121 16.2究竟是路徑名還是包名127 16.3包名衝突問題130 第17條理解Go語言運算式的求值順序132 17.1包級別變數聲明語句中的運算式求值順序133 17.2普通求值順序136 17.3設定陳述式的求值139 17.4switch/select語句中的運算式求值140 第18條理解Go語言代碼塊與作用域143 18.1Go代碼塊與作用域簡介143 18.2if條件控制語句的代碼塊145 18.3其他控制語句的代碼塊規則簡介148 第19條瞭解Go語言控制語句慣用法及使用注意事項154 19.1使用if控制語句時應遵循“快樂路徑”原則154 19.2for range的避“坑”指南156 19.3break跳到哪裡去了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.1defer的運作機制193 22.2defer的常見用法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.3defined類型的方法集合226 24.4類型別名的方法集合227 第25條瞭解變長參數函數的妙用230 25.1什麼是變長參數函數230 25.2類比函數重載233 25.3類比實現函數的可選參數與默認參數236 25.4實現功能選項模式238 第五部分介面 第26條瞭解介面類別型變數的內部表示246 26.1nil error值 != nil247 26.2介面類別型變數的內部表示248 26.3輸出介面類別型變數內部表示的詳細資訊254 26.4介面類別型的裝箱原理258 第27條儘量定義小介面263 27.1Go 定義小介面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.2Go併發設計實例290 第32條瞭解goroutine的調度原理299 32.1goroutine調度器299 32.2goroutine調度模型與演進過程300 32.3對goroutine調度器原理的進一步理解302 32.4調度器狀態的查看方法305 32.5goroutine調度實例簡要分析307 第33條掌握Go併發模型和常見併發模式315 33.1Go併發模型315 33.2Go常見的併發模式317 第34條瞭解channel的妙用340 34.1無緩衝channel341 34.2帶緩衝channel347 34.3nil channel的妙用354 34.4與select結合使用的一些慣用法357 第35條瞭解sync包的正確用法359 35.1sync包還是channel359 35.2使用sync包的注意事項360 35.3互斥鎖還是讀寫鎖362 35.4條件變數365 35.5使用sync.Once實現單例模式 368 35.6使用sync.Pool減輕垃圾回收壓力370 第36條使用atomic包實現伸縮性 好的併發讀取374 36.1atomic包與原子操作374 36.2對共用整型變數的無鎖讀寫375 36.3對共用自訂類型變數的無鎖讀寫377 第七部分錯誤處理 第37條瞭解錯誤處理的4種策略382 37.1構造錯誤值383 37.2透明錯誤處理策略385 37.3“哨兵”錯誤處理策略385 37.4錯誤數值型別檢視策略388 37.5錯誤行為特徵檢視策略390 第38條儘量優化反復出現的if err != nil392 38.1兩種觀點393 38.2儘量優化395 38.3優化思路395 第39條不要使用panic進行正常的錯誤處理405 39.1Go的panic不是Java的checked exception405 39.2panic的典型應用408 39.3理解panic的輸出資訊412 第八部分測試、性能剖析與調試 第40條理解包內測試與包外測試的差別 40.1官方文檔的“自相矛盾” 40.2包內測試與包外測試 第41條有層次地組織測試代碼 41.1經典模式—平鋪 41.2xUnit家族模式 41.3測試固件 第42條優先編寫表驅動的測試 42.1Go測試代碼的一般邏輯 42.2表驅動的測試實踐 42.3表驅動測試的優點 42.4表驅動測試實踐中的注意事項 第43條使用testdata管理測試依賴的外部資料檔案 43.1testdata目錄 43.2golden文件慣用法 第44條正確運用fake、stub和mock等輔助單元測試 44.1fake:真實元件或服務的簡化實現版替身 44.2stub:對返回結果有一定預設控制能力的替身 44.3mock:專用於行為觀察和驗證的替身 第45條使用模糊測試讓潛在bug無處遁形 45.1模糊測試在挖掘Go代碼的潛在bug中的作用 45.2go-fuzz的初步工作原理 45.3go-fuzz使用方法 45.4使用go-fuzz建立模糊測試的示例 45.5讓模糊測試成為“一等公民” 第46條為被測物件建立性能基準 46.1性能基準測試在Go語言中是“一等公民” 46.2循序執行和並存執行的性能基準測試 46.3使用性能基準比較工具 46.4排除額外幹擾,讓基準測試 第47條使用pprof對程式進行性能剖析 47.1pprof的工作原理 47.2使用pprof進行性能剖析的實例 第48條使用expvar輸出度量資料,輔助定位性能瓶頸點 48.1expvar包的工作原理 48.2自訂應用通過expvar輸出的度量資料 48.3輸出資料的展示 第49條使用Delve調試Go代碼 49.1關於調試,你首先應該知道的幾件事 49.2Go調試工具的選擇 49.3Delve調試基礎、原理與架構 49.4併發、Coredump檔與掛接進程調試 第九部分標準庫、反射與cgo 第50條理解Go TCP Socket網路程式設計模型 50.1TCP Socket網路程式設計模型 50.2TCP連接的建立 50.3Socket讀寫 50.4Socket屬性 50.5關閉連接 第51條使用net/http包實現安全通信 51.1HTTPS:在安全傳輸層上運行的HTTP協議 51.2HTTPS安全傳輸層的工作機制 51.3非對稱加密和公開金鑰證書 51.4對服務端公開金鑰證書的校驗 51.5對用戶端公開金鑰證書的校驗 第52條掌握字元集的原理和字元 編碼方案間的轉換 52.1字元與字元集 52.2Unicode字元集的誕生與UTF-8編碼方案 52.3字元編碼方案間的轉換 第53條掌握使用time包的正確方式 53.1時間的基礎操作 53.2時間的格式化輸出 53.3計時器的使用 第54條不要忽略對系統信號的處理 54.1為什麼不能忽略對系統信號的處理 54.2Go語言對系統信號處理的支援 54.3使用系統信號實現程式的優雅退出 第55條使用crypto下的密碼學包構建安全應用 55.1Go密碼學包概覽與設計原則 55.2區塊編碼器演算法 55.3公開金鑰密碼 55.4單向散列函數 55.5消息認證碼 55.6數位簽章 55.7亂數產生 第56條掌握bytes包和strings包的基本操作 56.1查找與替換 56.2比較 56.3分割 56.4拼接 56.5修剪與變換 56.6快速對接I/O模型 第57條理解標準庫的讀寫模型 57.1直接讀寫位元組序列 57.2直接讀寫抽象資料類型實例 57.3通過包裹類型讀寫資料 第58條掌握unsafe包的安全使用模式 58.1簡潔的unsafe包 58.2unsafe包的典型應用 58.3正確理解unsafe.Pointer與uintptr 58.4unsafe.Pointer的安全使用模式 第59條謹慎使用reflect包提供的反射能力 59.1Go反射的三大法則 59.2反射世界的入口 59.3反射世界的出口 59.4輸出參數、interface{}類型變數及反射物件的可設置性 第60條瞭解cgo的原理和使用開銷 60.1Go調用C代碼的原理 60.2在Go中使用C語言的類型 60.3在Go中連結外部C庫 60.4在C中使用Go函數 60.5使用cgo的開銷 60.6使用cgo代碼的靜態構建 第十部分工具鏈與工程實踐 第61條使用module管理包依賴 61.1Go語言包管理演進回顧 61.2Go module:Go包依賴管理的生產標準 61.3Go module代理 61.4升級module的主版本號 第62條構建 小Go程式容器鏡像 62.1鏡像:繼承中的創新 62.2“鏡像是個筐”:初學者的認知 62.3理性回歸:builder模式的崛起 62.4“像賽車那樣減重”:追求 小鏡像 62.5“要有光”:對多階段構建的支持 第63條自訂Go包的導入路徑 63.1govanityurls 63.2使用govanityurls 第64條熟練掌握Go常用工具 64.1獲取與安裝 64.2包或module檢視 64.3構建 64.4運行與診斷 64.5格式化與靜態代碼檢查 64.6重構 64.7查看文檔 64.8代碼導航與洞察 第65條使用go generate驅動代碼生成“驅動器” 65.2go generate的工作原理 65.3go generate的應用場景 第66條牢記Go的常見“陷阱” 66.1語法規範類 66.2標準庫類
客服公告
热门活动
订阅电子报