Go語言編程指南 Go Fundamentals: Gopher Guides

[美]馬克·貝茨(Mark Bates)

  • Go語言編程指南-preview-1
  • Go語言編程指南-preview-2
Go語言編程指南-preview-1

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

相關主題

商品描述

本書涵蓋了 Go 語言的基礎語法、核心概念、慣用法和高級特性,並提供了豐富的代碼示例,旨在幫助開發人員快速上手 Go 語言編程。

本書首先介紹了 Go 語言如何管理包、模塊和依賴,幫助讀者建立良好的項目結構。接著介紹了字符串、變量和常量等基礎知識。隨後詳細介紹了 Go 語言中的復合類型,如數組、切片、map、控制結構、函數、結構體、方法和指針等的正確使用方法。之後傳授了編寫高質量測試代碼的方法,並介紹了 Go 語言的接口和新的泛型功能及其使用方法。並發編程是 Go 語言的重要特性,本書最後專門介紹瞭如何利用並發提升代碼性能,並詳細講解了通道、Context 及其他高級同步原語的使用方法。

本書根據作者的 Gopher Guides 培訓課程編寫,適合 Go 語言初學者和具備其他編程語言知識的開發人員學習和參考,也可作為高等院校相關專業的教學參考書。

作者簡介

马克·贝茨 Gopher Guides 的联合创始人和讲师。Gopher Guides 是 Go 语言培训、咨询和会议研讨方面的行业先驱。自 2000年以来,马克·贝茨一直与世界上一些规模很大且具有创新性的公司合作,包括苹果、Uber 和 Visa。马克·贝茨于 2013 年发现了 Go 语言并在世界各地组织、主持 Go 语言会议,或在 Go 语言会议上发言,他经常参加 Go Time 播客节目。

 

科瑞·拉诺 Gopher Guides 的联合创始人和讲师。在过去的 20 年里,他一直专注于初创企业的全栈技术。科瑞·拉诺与 Go 语言有很深的渊源,曾发起 Go 聚会——Denver Gophers。他利用自己在 InfluxDB(一个用Go 语言编写的高可扩展的数据库)等项目上的实际经验,开设了大量实用的 Go 语言培训课程,并发表了许多相关文章。

目錄大綱

目錄

 

 

 

第 1章 模塊、包和依賴 1

1.1 模塊 1

1.1.1 工具鏈 2

1.1.2 初始化一個模塊 3

1.1.3 版本控制系統與模塊 3

1.2 包 4

1.2.1 什麽是包 4

1.2.2 包命名 4

1.3 文件夾、文件與代碼組織 6

1.3.1 同一文件夾下的多個包 7

1.3.2 文件命名 8

1.3.3 包組織 8

1.4 導入包和模塊 11

1.4.1 導入路徑 12

1.4.2 使用import關鍵字 13

1.4.3 解決導入包的名字沖突問題 13

1.5 依賴 15

1.5.1 使用依賴 15

1.5.2 使用go get添加依賴 16

1.5.3 go.sum文件 18

1.5.4 更新依賴 19

1.5.5 語義版本 20

1.5.6 多版本 20

1.5.7 循環導入 21

1.6 本章小結 23

 

第 2章 Go語言基礎 24

2.1 Go語言概述 24

2.1.1 靜態類型 24

2.1.2 垃圾回收 25

2.1.3 編譯 25

2.1.4 關鍵字、運算符和分隔符 26

2.2 數值 27

2.2.1 選擇正確的數值類型 28

2.2.2 溢出和繞回 28

2.2.3 飽和 30

2.3 字符串 30

2.3.1 解釋型字符串字面值 30

2.3.2 原始字符串字面值 31

2.4 UTF-8 32

2.4.1 rune 33

2.4.2 遍歷UTF-8字符串 33

2.5 變量 35

2.5.1 變量聲明 35

2.5.2 變量賦值 35

2.5.3 零值 36

2.5.4 nil 37

2.5.5 零值速查表 37

2.5.6 變量聲明與初始化 38

2.5.7 多變量賦值 39

2.5.8 未使用的變量 40

2.6 常量 41

2.6.1 帶類型的常量 43

2.6.2 無類型常量(推斷類型) 43

2.6.3 類型推斷 44

2.7 標識符命名 45

2.7.1 命名風格 46

2.7.2 與包名沖突 47

2.7.3 通過首字母大寫實現標識符導出 50

2.8 打印與格式化 50

2.8.1 格式化函數 50

2.8.2 換行 52

2.8.3 使用Println打印多個參數 53

2.8.4 使用格式化函數 53

2.8.5 轉義序列 53

2.8.6 格式化字符串 55

2.8.7 格式化整型 55

2.8.8 格式化浮點型 57

2.8.9 打印值的類型 58

2.8.10 打印值 59

2.8.11 打印值的更多細節 59

2.8.12 以Go語法格式打印值 60

2.8.13 錯誤使用格式化控制符 61

2.8.14 顯式的實參索引 62

2.8.15 字符串與數值的相互轉換 63

2.9 本章小結 65

 

第3章 數組、切片和迭代 66

3.1 列表類型:數組與切片 66

3.1.1 數組與切片的差異 66

3.1.2 識別差異 67

3.1.3 初始化數組與切片 68

3.1.4 數組與切片的零值 69

3.1.5 數組與切片的索引 70

3.1.6 數組與切片類型 71

3.1.7 數組與切片類型的定義 71

3.1.8 設置數組與切片變量的值 72

3.1.9 向切片追加元素 73

3.1.10 向切片追加一個切片 74

3.2 切片的工作原理 77

3.2.1 長度與容量 78

3.2.2 切片的擴容 79

3.2.3 使用make函數創建切片 81

3.2.4 使用帶長度和容量參數的make函數 82

3.2.5 make與append函數 83

3.2.6 切片擴容時發生了什麽 83

3.2.7 子切片 85

3.2.8 修改子切片 85

3.2.9 復制切片 86

3.2.10 將數組轉換為切片 88

3.3 迭代 89

3.3.1 for循環 89

3.3.2 迭代數組與切片 90

3.3.3 range關鍵字 90

3.3.4 控制循環 91

3.3.5 do-while循環 93

3.4 本章小結 94

 

 

第4章 map和控制結構 95

4.1 map 95

4.1.1 長度和容量 96

4.1.2 初始化map 97

4.1.3 未初始化的map 97

4.1.4 map的鍵 98

4.1.5 以結構體作為鍵 98

4.1.6 迭代map 99

4.1.7 刪除map中的鍵 101

4.1.8 不存在的map鍵 102

4.1.9 檢查map中的鍵是否存在 103

4.1.10 利用零值 103

4.1.11 僅測試鍵的存在性 104

4.1.12 map和復雜值 105

4.1.13 插入時復制 106

4.1.14 列出map中的鍵 108

4.2 if語句 111

4.2.1 else語句 111

4.2.2 else if 語句 112

4.2.3 賦值作用域 113

4.2.4 邏輯和數學運算符 115

4.3 switch語句 116

4.3.1 default 118

4.3.2 fallthrough 119

4.4 本章小結 120

 

 

第5章 函數 121

5.1 函數定義 121

5.1.1 參數 121

5.1.2 相同類型的參數 122

5.1.3 返回值 123

5.1.4 多返回值 123

5.1.5 具名返回值 125

5.1.6 作為一等公民的函數 126

5.1.7 閉包 127

5.1.8 匿名函數 128

5.1.9 接受其他函數的返回值作為參數 129

5.2 可變參數 129

5.2.1 可變參數的位置 130

5.2.2 擴展切片 131

5.2.3 何時使用可變參數 132

5.3 延遲函數調用 133

5.3.1 多個返迴路徑下的延遲執行 133

5.3.2 延遲函數調用的執行順序 134

5.3.3 延遲函數調用與panic 135

5.3.4 defer與Exit/Fatal 135

5.3.5 defer與匿名函數 136

5.3.6 defer與作用域 137

5.4 init函數 139

5.4.1 多個init函數 139

5.4.2 init函數的執行順序 140

5.4.3 利用init函數的導入副作用 140

5.5 本章小結 142

 

 

第6章 結構體、方法和指針 143

6.1 結構體 143

6.1.1 在Go語言中聲明新類型 143

6.1.2 定義結構體 144

6.1.3 初始化結構體 145

6.1.4 不帶字段名的初始化 146

6.1.5 訪問結構體字段 147

6.1.6 結構體標簽 148

6.1.7 編碼用的結構體標簽 148

6.1.8 使用結構體標簽 150

6.2 方法 150

6.2.1 方法與函數的不同 151

6.2.2 方法表達式 151

6.2.3 第三方類型的方法 152

6.2.4 函數作為類型 154

6.2.5 函數的方法 154

6.2.6 沒有繼承 155

6.3 指針 156

6.3.1 值傳遞 156

6.3.2 接收指針 158

6.3.3 獲取指針 158

6.3.4 傳遞指針 159

6.3.5 使用指針 160

6.3.6 值接收者與指針接收者 161

6.3.7 new函數 162

6.3.8 性能 163

6.3.9 nil接收者 164

6.3.10 nil接收者檢查 165

6.4 本章小結 166

 

 

第7章 測試 167

7.1 測試基礎 167

7.1.1 命名 167

7.1.2 testing.T類型 168

7.1.3 標記測試失敗 169

7.1.4 使用t.Error 170

7.1.5 使用T.Fatal(推薦) 172

7.1.6 精心編寫測試失敗的信息 173

7.2 代碼覆蓋率 174

7.2.1 代碼覆蓋率基礎 174

7.2.2 生成覆蓋率報告 174

7.2.3 go tool cover命令 175

7.2.4 生成HTML覆蓋率報告 176

7.2.5 編輯器支持 177

7.3 表驅動測試 178

7.3.1 表驅動測試剖析 178

7.3.2 編寫表驅動測試 179

7.3.3 子測試 181

7.3.4 子測試剖析 181

7.3.5 編寫子測試 182

7.4 運行測試 183

7.4.1 運行指定包的測試 183

7.4.2 運行當前包及子包中的測試 183

7.4.3 輸出測試詳細信息 183

7.4.4 在測試中輸出日誌 184

7.4.5 短測試 185

7.4.6 並行運行包測試 186

7.4.7 並行運行測試 186

7.4.8 運行特定的測試 187

7.4.9 設置測試超時時間 188

7.4.10 快速失敗 189

7.4.11 禁用測試緩存 190

7.5 測試輔助函數 190

7.5.1 定義測試輔助函數 190

7.5.2 將函數標記為測試輔助函數 194

7.5.3 清理測試輔助函數的資源 195

7.6 本章小結 196

 

 

第8章 接口 197

8.1 具體類型VS.接口 197

8.2 顯式接口實現 199

8.3 隱式接口實現 200

8.4 使用接口之前 201

8.5 使用接口 202

8.6 實現io.Writer接口 204

8.7 多個接口 206

8.8 斷言接口實現 206

8.9 空接口 207

8.9.1 any 關鍵字 207

8.9.2 空接口的問題 207

8.9.3 使用空接口 208

8.10 定義接口 208

8.10.1 定義Model接口 209

8.10.2 實現接口 211

8.11 嵌入接口 212

8.12 類型斷言 214

8.12.1 對斷言進行斷言 214

8.12.2 斷言具體類型 215

8.13 通過switch語句進行斷言 215

8.13.1 捕獲switch語句中的類型斷言結果 216

8.13.2 註意case子句的順序 216

8.14 使用斷言 217

8.14.1 定義回調接口 218

8.14.2 代碼拆解分析 219

8.15 本章小結 219

 

 

第9章 錯誤 220

9.1 錯誤作為值 220

9.1.1 error 接口 222

9.1.2 處理錯誤 223

9.1.3 使用錯誤 224

9.2 panic 225

9.2.1 引發panic 225

9.2.2 從panic狀態恢復 226

9.2.3 捕獲並返回panic值 229

9.3 不要主動拋出panic 232

9.3.1 檢查nil 233

9.3.2 創建map 235

9.3.3 指針 237

9.3.4 接口 238

9.3.5 函數 241

9.3.6 類型斷言 242

9.3.7 數組/切片的索引 244

9.4 自定義錯誤 246

9.4.1 標準錯誤 247

9.4.2 實現自定義錯誤 248

9.5 包裝錯誤和解包裝錯誤 250

9.5.1 包裝錯誤 252

9.5.2 解包裝錯誤 253

9.5.3 解包裝自定義錯誤 254

9.5.4 包裝或者不包裝 257

9.6 errors.As和errors.Is函數 257

9.6.1 As函數 258

9.6.2 Is函數 260

9.7 棧跟蹤信息 262

9.8 本章小結 263

 

 

第 10章 泛型 264

10.1 什麽是泛型 264

10.1.1 接口存在的問題 264

10.1.2 類型約束 268

10.1.3 多重泛型類型 269

10.1.4 實例化泛型函數 271

10.1.5 定義約束 272

10.1.6 多類型約束 273

10.1.7 底層類型約束 275

10.1.8 constraints包 277

10.1.9 類型斷言 279

10.1.10 混合使用方法約束和類型約束 281

10.1.11 泛型類型 281

10.2 本章小結 284

 

 

第 11章 通道 285

11.1 並發和並行 285

11.1.1 並發不等於並行 286

11.1.2 理解並發 286

11.2 Go語言中的並發模型 287

11.2.1 goroutine 288

11.2.2 goroutine的內存 288

11.2.3 Go調度器 288

11.2.4 工作共享和竊取 289

11.2.5 不要擔心調度器 290

11.2.6 goroutine示例 291

11.3 使用通道通信 291

11.3.1 什麽是通道 291

11.3.2 瞭解通道阻塞/解除阻塞 292

11.3.3 創建通道 292

11.3.4 發送和接收值 293

11.3.5 一個簡單的通道示例 294

11.3.6 在通道上使用range 295

11.3.7 使用select語句監聽通道 296

11.3.8 使用select語句 296

11.3.9 通道不是消息隊列 297

11.4 單向通道 298

11.5 關閉通道 299

11.5.1 在讀取消息時檢測關閉的通道 301

11.5.2 從已關閉的通道中讀取數據時返回零值 302

11.5.3 關閉一個已經關閉的通道 303

11.5.4 向已關閉通道中寫入數據 304

11.6 帶緩沖的通道 305

11.6.1 簡單的帶緩沖的通道示例 305

11.6.2 從關閉的帶緩沖的通道中讀取消息 307

11.7 使用通道捕獲系統信號 308

11.7.1 os/signal包 309

11.7.2 實現優雅地關閉 310

11.7.3 監聽系統信號 312

11.7.4 監聽關閉確認消息 313

11.7.5 超時無響應關閉 314

11.8 本章小結 315

 

 

第 12章 Context 316

12.1 context.Context接口 317

12.1.1 Context的Deadline方法 317

12.1.2 Context的Done方法 317

12.1.3 Context的Err方法 318

12.1.4 Context的Value方法 319

12.1.5 輔助函數 320

12.1.6 初始Context 321

12.1.7 默認實現 322

12.2 Context規則 322

12.3 Context節點層級 323

12.3.1 理解節點層級 323

12.3.2 用Context值包裝 324

12.3.3 接續Context節點 324

12.4 Context傳值 326

12.4.1 理解Context傳值 326

12.4.2 鍵解析 328

12.5 字符串作為鍵存在的問題 329

12.5.1 鍵沖突 330

12.5.2 自定義字符串鍵類型 331

12.6 保護Context中的鍵和值 333

12.7 用Context傳播取消事件 336

12.7.1 創建可取消的Context 337

12.7.2 取消Context 338

12.7.3 監聽取消確認 340

12.8 超時和截止時間 344

12.8.1 在指定時間點取消 344

12.8.2 一段時間後取消 345

12.9 Context錯誤 346

12.9.1 Context取消錯誤 347

12.9.2 超出截止時間錯誤 348

12.10 使用Context監聽系統信號 349

12.11 本章小結 353

 

 

第 13章 同步 354

13.1 使用WaitGroup等待goroutine 354

13.1.1 問題 354

13.1.2 使用WaitGroup 355

13.1.3 Wait方法 356

13.1.4 Add方法 357

13.1.5 Done方法 361

13.1.6 關於WaitGroup的小結 365

13.2 使用errgroup.Group進行錯誤管理 367

13.2.1 問題 367

13.2.2 errgroup.Group類型 369

13.2.3 監聽errgroup.Group類型的取消 371

13.2.4 關於errgroup.Group類型的小結 373

13.3 數據競爭 375

13.3.1 競爭檢測器 377

13.3.2 大多數,但不是全部 378

13.3.3 關於競爭檢測器的小結 378

13.4 使用互斥鎖同步訪問 379

13.4.1 sync.Locker接口 381

13.4.2 使用互斥鎖 382

13.4.3 讀寫互斥鎖 384

13.4.4 不當使用 386

13.4.5 有關讀/寫互斥鎖的小結 389

13.5 僅執行一次任務 389

13.5.1 問題 390

13.5.2 實現一次性操作 391

13.5.3 使用Once關閉通道 393

13.6 本章小結 395

 

 

第 14章 使用文件 396

14.1 目錄項和文件信息 396

14.1.1 讀取目錄 397

14.1.2 fs.FileInfo接口 399

14.1.3 獲取文件狀態 400

14.2 遍歷目錄 401

14.3 跳過目錄和文件 404

14.4 創建目錄和子目錄 408

14.5 文件路徑輔助函數 410

14.5.1 獲取文件的擴展名 411

14.5.2 獲取文件所在的目錄 411

14.5.3 獲取文件或目錄的名字 412

14.5.4 使用文件路徑輔助函數 412

14.5.5 檢查錯誤 413

14.6 創建多個目錄 415

14.7 創建文件 417

14.8 修復遍歷測試 422

14.9 向文件中追加內容 424

14.10 讀文件 427

14.11 註意Windows系統 428

14.12 fs包 429

14.12.1 fs.FS接口 430

14.12.2 fs.File接口 431

14.13 使用fs.FS接口 432

14.14 模擬文件系統 435

14.15 嵌入文件 438

14.15.1 使用嵌入文件 439

14.15.2 將文件嵌入二進制文件中 441

14.15.3 修改嵌入的文件 442

14.15.4 將文件作為string或者byte切片嵌入 443

14.16 本章小結 443

最後瀏覽商品 (1)