深入理解Go語言(第3版)
[美]米哈裡斯·托卡洛斯 著 劉曉雪 譯
商品描述
目錄大綱
目錄
第 1 章 Go 語言快速入門 1
1.1 Go 語言簡介 1
1.1.1 Go 語言的歷史 2
1.1.2 為什麽選擇 UNIX 而不是 Windows 3
1.1.3 Go 語言的優缺點 4
1.1.4 go doc 和 godoc 實用程序 5
1.2 Hello World! 6
1.2.1 函數簡介 7
1.2.2 包簡介 7
1.3 運行 Go 代碼 8
1.3.1 編譯 Go 代碼 8
1.3.2 像腳本語言那樣使用 Go 語言 8
1.3.3 導入格式和編碼規則 9
1.4 Go 語言的重要特性 10
1.4.1 定義和使用變量 10
1.4.2 控製程序流 13
1.4.3 使用 for 循環和 range 進行迭代 15
1.4.4 獲取用戶輸入 17
1.4.5 使用 error 變量區分輸入類型 21
1.4.6 理解 Go 語言的並發模型 23
1.5 開發 Go 語言中的 which(1)工具 25
1.6 記錄信息 27
1.6.1 log.Fatal()和 log.Panic() 29
1.6.2 寫入自定義日誌文件 30
1.6.3 在日誌條目中打印行號 32
1.7 Go 語言中的泛型 33
1.8 開發一個基本的電話簿應用程序 35
1.9 本章練習 38
1.10 本章小結 39
1.11 附加資源 39
第 2 章 基本數據類型 40
2.1 error 數據類型 40
2.2 數值數據類型 43
2.3 非數值數據類型 46
2.3.1 字符串、字符和 rune 46
2.3.2 日期和時間 53
2.4 Go 常量 58
2.5 將相似數據分組 61
2.5.1 數組 61
2.5.2 切片 61
2.6 指針 79
2.7 生成隨機數 82
2.7.1 生成隨機字符串 83
2.7.2 生成安全的隨機數 85
2.8 更新電話簿應用程序 85
2.9 本章練習 87
2.10 本章小結 87
2.11 附加資源 87
第 3 章 復合數據類型 88
3.1 映射 88
3.1.1 存儲到一個 nil 映射 89
3.1.2 迭代映射 91
3.2 結構體 92
3.2.1 定義新的結構體 92
3.2.2 使用 new 關鍵字 93
3.2.3 結構體切片 95
3.3 正則表達式和模式匹配 97
3.3.1 Go 語言中的正則表達式 97
3.3.2 匹配姓名和姓氏 98
3.3.3 匹配整數 99
3.3.4 匹配記錄中的字段 100
3.4 改進電話簿應用程序 101
3.4.1 處理 CSV 文件 101
3.4.2 添加索引 105
3.4.3 電話簿應用程序的改進版本 106
3.5 本章練習 114
3.6 本章小結 114
3.7 附加資源 114
第 4 章 反射和接口 115
4.1 反射 115
4.1.1 Go 結構體的內部結構 117
4.1.2 使用反射修改結構體值 119
4.1.3 反射的 3 個缺點 120
4.2 類型方法 121
4.2.1 創建類型方法 121
4.2.2 使用類型方法 122
4.3 接口 125
4.3.1 sort.Interface 接口 127
4.3.2 空接口 130
4.3.3 類型斷言和類型開關 131
4.3.4 map[string]interface{}映射 135
4.3.5 error 數據類型 138
4.3.6 編寫自己的接口 142
4.4 處理兩種不同的 CSV 文件格式 147
4.5 Go 語言中的面向對象編程 151
4.6 更新電話簿應用程序 154
4.6.1 設置 CSV 文件值 155
4.6.2 使用 sort 包 156
4.7 本章練習 158
4.8 本章小結 158
4.9 附加資源 158
第 5 章 Go 包和函數 159
5.1 Go 包 159
5.2 函數 162
5.2.1 匿名函數 163
5.2.2 返回多個值的函數 163
5.2.3 可以命名的函數返回值 164
5.2.4 接收其他函數作為參數的函數 165
5.2.5 函數可以返回其他函數 167
5.2.6 可變參數函數 168
5.2.7 defer 關鍵字 172
5.3 開發自己的包 174
5.3.1 init()函數 175
5.3.2 執行順序 175
5.4 使用 GitHub 存儲 Go 包 176
5.5 用於操作數據庫的包 178
5.5.1 瞭解數據庫 179
5.5.2 存儲 Go 包 183
5.5.3 Go 包的設計 184
5.5.4 Go 包的實現 186
5.5.5 測試 Go 包 193
5.6 模塊 197
5.7 創建更好的包 197
5.8 生成文檔 198
5.9 GitLab Runners 和 Go 205
5.9.1 初始版本的配置文件 205
5.9.2 最終版本的配置文件 207
5.10 GitHub Actions 和 Go 209
5.11 版本控制工具 211
5.12 本章練習 213
5.13 本章小結 213
5.14 附加資源 213
第 6 章 告訴 UNIX 系統該做什麽 215
6.1 stdin、stdout 和 stderr 216
6.2 UNIX 進程 216
6.3 處理 UNIX 信號 217
6.4 文件 I/O 220
6.4.1 io.Reader 和 io.Writer 接口 220
6.4.2 使用和濫用 io.Reader 和 io.Writer 221
6.4.3 緩沖和非緩沖文件 I/O 225
6.5 讀取文本文件 226
6.5.1 逐行讀取文本文件 226
6.5.2 逐字讀取文本文件 227
6.5.3 逐字符讀取文本文件 229
6.5.4 從/dev/random 讀取 230
6.5.5 從文件中讀取特定數量的數據 231
6.6 寫入文件 232
6.7 處理 JSON 數據 235
6.7.1 使用 Marshal()和 Unmarshal() 235
6.7.2 Go 結構體和 JSON 237
6.7.3 以流的形式讀取和寫入 JSON 數據 238
6.7.4 美觀打印 JSON 記錄 239
6.8 處理 XML 數據 241
6.9 處理 YAML 數據 243
6.10 viper 包 245
6.10.1 使用命令行標志 246
6.10.2 讀取 JSON 配置文件 248
6.11 cobra 包 252
6.11.1 基於 3 條命令的實用工具 253
6.11.2 添加命令行標志 254
6.11.3 創建命令行別名 255
6.11.4 創建子命令 255
6.12 在 UNIX 文件系統中查找循環 256
6.13 Go 1.16 中的新特性 259
6.13.1 嵌入文件 259
6.13.2 ReadDir 和 DirEntry 262
6.13.3 io/fs 包 264
6.14 更新電話簿應用程序 266
6.14.1 使用 cobra 266
6.14.2 存儲和加載 JSON 數據 267
6.14.3 實現 delete 命令 268
6.14.4 實現 insert 命令 269
6.14.5 實現 list 命令 269
6.14.6 實現 search 命令 269
6.15 本章練習 271
6.16 本章小結 271
6.17 附加資源 272
第 7 章 Go 語言中的並發性 273
7.1 進程、線程和協程 274
7.2 Go 調度器 274
7.2.1 GOMAXPROCS 環境變量 276
7.2.2 並發和並行 277
7.3 協程 278
7.3.1 創建一個協程 278
7.3.2 創建多個協程 279
7.3.3 等待協程完成 279
7.3.4 Add()和 Done()調用的次數不同 281
7.3.5 使用協程創建多個文件 283
7.4 通道 283
7.4.1 向通道寫入和從通道讀取 284
7.4.2 從已關閉的通道接收 287
7.4.3 作為函數參數的通道 288
7.5 競態條件 288
7.6 select 關鍵字 291
7.7 協程超時 293
7.7.1 main()中的協程超時 293
7.7.2 main()之外的協程超時 294
7.8 重新審視 Go 通道 295
7.8.1 緩沖通道 296
7.8.2 nil 通道 298
7.8.3 工作池 299
7.8.4 信號通道 303
7.9 共享內存和共享變量 305
7.9.1 sync.Mutex 類型 306
7.9.2 sync.RWMutex 類型 308
7.9.3 atomic 包 311
7.9.4 使用協程共享內存 312
7.10 閉包變量和 go 語句 315
7.11 context 包 317
7.12 semaphore 包 322
7.13 本章練習 325
7.14 本章小結 325
7.15 附加資源 325
第 8 章 構建 Web 服務 326
8.1 net/http 包 326
8.1.1 http.Response 類型 326
8.1.2 http.Request 類型 327
8.1.3 http.Transport 類型 328
8.2 創建一個 Web 服務器 329
8.3 更新電話簿應用程序 332
8.3.1 定義 API 332
8.3.2 實現處理程序 333
8.4 將指標公開與 Prometheus 341
8.4.1 runtime/metrics 包 341
8.4.2 公開指標 343
8.4.3 讀取指標 351
8.4.4 將指標放入 Prometheus 352
8.4.5 在 Grafana 中可視化 Prometheus 指標 356
8.5 開發 Web 客戶端 357
8.5.1 使用 http.NewRequest()改進客戶端 359
8.5.2 為電話薄服務創建客戶端 362
8.6 創建文件服務器 368
8.7 對 HTTP 連接進行超時設置 371
8.7.1 使用 SetDeadline() 371
8.7.2 在客戶端設置超時周期 372
8.7.3 在服務器端設置超時周期 375
8.8 本章練習 376
8.9 本章小結 377
8.10 附加資源 377
第 9 章 TCP/IP 和 WebSocket 378
9.1 TCP/IP 378
9.2 net 包 380
9.3 開發 TCP 客戶端 380
9.3.1 利用 net.Dial()開發 TCP 客戶端 380
9.3.2 利用 net.DialTCP()開發 TCP 客戶端 382
9.4 開發 TCP 服務器 384
9.4.1 利用 net.Listen()開發 TCP 服務器 384
9.4.2 利用 net.ListenTCP()開發 TCP 服務器 386
9.5 開發 UDP 客戶端 389
9.6 開發 UDP 服務器 391
9.7 開發並發 TCP 服務器 394
9.8 使用 UNIX 域套接字 396
9.8.1 UNIX 域套接字服務器 396
9.8.2 UNIX 域套接字客戶端 399
9.9 創建 WebSocket 服務器 401
9.9.1 服務器的實現 402
9.9.2 使用 websocat 405
9.9.3 使用 JavaScript 406
9.10 開發 WebSocket 客戶端 409
9.11 本章練習 413
9.12 本章小結 414
9.13 附加資源 414
第 10 章 REST APIs 415
10.1 REST 簡介 415
10.2 開發 RESTful 服務器和客戶端 417
10.2.1 RESTful 服務器 418
10.2.2 RESTful 客戶端 426
10.3 創建一個功能性的 RESTful 服務器 435
10.3.1 REST API 435
10.3.2 使用 gorilla/mux 436
10.3.3 使用子路由器 437
10.3.4 與數據庫協作 437
10.3.5 測試 restdb 包 442
10.3.6 實現 RESTful 服務器 444
10.3.7 測試 RESTful 服務器 448
10.4 開發 RESTful 客戶端 451
10.4.1 創建命令行客戶端的結構 452
10.4.2 實現 RESTful 客戶端命令 453
10.4.3 創建 RESTful 客戶端 457
10.4.4 處理多個 REST API 版本 459
10.5 上傳和下載二進制文件 459
10.6 使用 Swagger 進行 REST API 文檔編寫 464
10.6.1 為 REST API 編寫文檔 466
10.6.2 生成文檔文件 469
10.6.3 提供文檔文件服務 470
10.7 本章練習 472
10.8 本章小結 473
10.9 附加資源 473
第 11 章 代碼測試與性能分析 474
11.1 代碼優化 474
11.2 基準測試代碼 475
11.2.1 重寫 main()函數 476
11.2.2 基準測試緩沖寫入和讀取 477
11.2.3 benchstat 實用工具 481
11.2.4 錯誤定義的基準測試函數 481
11.3 代碼性能分析 482
11.3.1 命令行應用程序的性能分析 483
11.3.2 HTTP 服務器性能分析 486
11.3.3 Go 性能分析器的 Web 界面 488
11.4 go tool trace 實用程序 488
11.4.1 從客戶端追蹤 Web 服務器 491
11.4.2 訪問 Web 服務器的所有路由 494
11.5 測試 Go 代碼 499
11.5.1 編寫./ch03/intRE.go 測試 499
11.5.2 TempDir()函數 500
11.5.3 Cleanup()函數 501
11.5.4 testing/quick 包 503
11.5.5 超時測試 505
11.5.6 測試代碼覆蓋率 506
11.5.7 發現 Go 語言中的不可達代碼 509
11.6 測試基於數據庫後端的 HTTP 服務器 510
11.7 模糊測試 516
11.8 交叉編譯 517
11.9 使用 go:generate 518
11.10 生成示例函數 521
11.11 本章練習 522
11.12 本章小結 523
11.13 附加資源 523
第 12 章 與 gRPC 協同工作 524
12.1 gRPC 簡介 524
12.2 定義接口定義語言文件 525
12.3 創建 gRPC 服務器 528
12.4 開發 gRPC 客戶端 532
12.5 本章練習 536
12.6 本章小結 536
12.7 附加資源 537
第 13 章 Go 語言中的泛型 538
13.1 泛型簡介 538
13.2 約束條件 540
13.3 使用泛型定義新數據類型 543
13.4 接口和泛型 546
13.5 反射和泛型 549
13.6 本章練習 551
13.7 本章小結 551
13.8 附加資源 552
附錄 553