精通 Go 語言, 2/e Mastering Go: Create Golang production applications using network libraries, concurrency, machine learning, and advanced data structures, 2/e

Tsoukalos, Mihalis 劉曉雪 譯

  • 精通 Go 語言, 2/e-preview-1
  • 精通 Go 語言, 2/e-preview-2
  • 精通 Go 語言, 2/e-preview-3
精通 Go 語言, 2/e-preview-1

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

商品描述

《精通Go語言(第2版)》詳細闡述了與Go語言相關的基本解決方案,主要包括Go語言和操作系統,理解Go語言的內部機制,處理Go語言中的基本數據類型,組合類型的使用,利用數據結構改進Go代碼,Go包和函數,反射和接口,UNIX系統編程,Go語言中的並發編程—協程、通道和管道,Go語言的並發性—高級話題,代碼測試、優化和分析,網絡編程基礎知識,網絡編程—構建自己的服務器和客戶端,Go語言中的機器學習等內容。此外,本書還提供了相應的示例、代碼,以幫助讀者進一步理解相關方案的實現過程。 本書適合作為高等院校電腦及相關專業的教材和教學參考書,也可作為相關開發人員的自學用書和參考手冊。

目錄大綱

目    錄
第1部分
第1章  Go語言和操作系統 3
  1.1  Go語言的歷史 3
  1.2  Go語言的未來 4
  1.3  Go語言的優點 4
  1.3.1  Go語言是否完美 5
  1.3.2  預處理器 5
  1.3.3  godoc實用程序 6
  1.4  編譯Go代碼 7
  1.5  執行Go代碼 8
  1.6  兩條Go語言規則 8
  1.7  下載和使用外部的Go包 10
  1.8  UNIX stdin、stdout和stderr 12
  1.9  輸出結果 12
  1.10  使用標準輸出 14
  1.11  獲取用戶輸入 16
  1.11.1  :=和= 16
  1.11.2  從標準輸入中讀取 17
  1.11.3  與命令行參數協同工作 18
  1.12  錯誤的輸出結果 20
  1.13  寫入日誌文件中 22
  1.13.1  日誌級別 22
  1.13.2  日誌工具 23
  1.13.3  日誌服務器 23
  1.13.4  將信息發送至日誌文件的Go程序 24
  1.13.5  log.Fatal()函數 26
  1.13.6  log.Panic()函數 27
  1.13.7  寫入自定義日誌文件中 29
  1.13.8  在日誌項中輸出行號 31
  1.14  Go語言中的錯誤處理機制 32
  1.14.1  錯誤數據類型 33
  1.14.2  錯誤處理機制 35
  1.15  使用Docker 37
  1.16  練習和鏈接 42
  1.17  本章小結 43

第2章  理解Go語言的內部機制 45
  2.1  Go編譯器 45
  2.2  垃圾收集 47
  2.2.1  三色算法 49
  2.2.2  Go垃圾收集器的更多內容 52
  2.2.3  映射、切片和Go垃圾收集器 53
  2.2.4  不安全的代碼 57
  2.2.5  unsafe包 58
  2.2.6  unsafe包的另一個示例 59
  2.3  從Go程序中調用C代碼 60
  2.3.1  利用同一文件從Go程序中調用C代碼 60
  2.3.2  利用單獨的文件從Go程序中調用C代碼 61
  2.3.3  C代碼 61
  2.3.4  Go代碼 62
  2.3.5  混合Go和C代碼 63
  2.4  從C代碼中調用Go函數 64
  2.4.1  Go包 65
  2.4.2  C代碼 66
  2.5  defer關鍵字 67
  2.6  panic()和recover()函數 71
  2.7  兩個方便的UNIX實用程序 74
  2.7.1  strace工具 74
  2.7.2  dtrace工具 75
  2.8  Go環境 76
  2.9  go env命令 78
  2.10  Go匯編器 79
  2.11  節點樹 80
  2.12  go build的更多內容 86
  2.13  生成WebAssembly代碼 88
  2.13.1  WebAssembly簡介 88
  2.13.2  WebAssembly的重要性 89
  2.13.3  Go和WebAssembly 89
  2.13.4  示例 89
  2.13.5  使用生成後的WebAssembly代碼 90
  2.14  一般的Go編碼建議 92
  2.15  練習和鏈接 93
  2.16  本章小結 93

第3章  處理Go語言中的基本數據類型 95
  3.1  數字數據類型 95
  3.1.1  整數 96
  3.1.2  浮點數 96
  3.1.3  復數 96
  3.1.4  Go 2中的數字字面值 98
  3.2  Go語言中的循環 99
  3.2.1  for循環 99
  3.2.2  while循環 99
  3.2.3  range關鍵字 100
  3.2.4  多種Go循環示例 100
  3.3  Go語言中的數組 102
  3.3.1  多維數組 102
  3.3.2  數組的缺點 105
  3.4  Go語言中的切片 105
  3.4.1  在切片上執行基本的操作 106
  3.4.2  自動擴展 108
  3.4.3  字節切片 109
  3.4.4  copy()函數 109
  3.4.5  多維切片 112
  3.4.6  切片的另一個示例 112
  3.4.7  利用sort.Slice()函數對切片進行排序 114
  3.4.8  向切片中附加一個數組 116
  3.5  Go語言中的映射 117
  3.5.1  存儲至nil映射中 119
  3.5.2  何時應使用映射 120
  3.6  Go語言中的常量 120
  3.7  Go語言中的指針 124
  3.8  時間和日期 127
  3.8.1  與時間協同工作 128
  3.8.2  解析時間 129
  3.8.3  與日期協同工作 130
  3.8.4  解析日期 130
  3.8.5  修改日期和時間格式 132
  3.9  度量Go語言中的命令和函數的執行時間 133
  3.10  度量Go語言垃圾收集器的操作 135
  3.11  Web鏈接和練習 136
  3.12  本章小結 136

第4章  組合類型的使用 137
  4.1  關於組合類型 137
  4.2  Go語言中的結構 137
  4.2.1  指向結構的指針 140
  4.2.2  Go語言中的new關鍵字 142
  4.3  Go語言中的元組 142
  4.4  Go語言中的正則表達式和模式匹配 144
  4.4.1  理論知識簡介 144
  4.4.2  簡單的示例 144
  4.4.3  高級示例 147
  4.4.4  匹配IPv4地址 150
  4.5  Go語言中的字符串 154
  4.5.1  rune 156
  4.5.2  unicode包 158
  4.5.3  strings包 159
  4.6  switch語句 163
  4.7  計算高精度Pi值 167
  4.8  生成Go語言中的鍵-值存儲 170
  4.9  Go語言和JSON格式 175
  4.9.1  讀取JSON數據 175
  4.9.2  保存JSON數據 177
  4.9.3  使用Marshal()和Unmarshal()函數 179
  4.9.4  解析JSON數據 181
  4.9.5  Go語言和XML 183
  4.9.6  讀取XML文件 186
  4.9.7  自定義XML格式 188
  4.10  Go語言和YAML格式 189
  4.11  附加資源 190
  4.12  練習和Web鏈接 190
  4.13  本章小結 191

第2部分
第5章  利用數據結構改進Go代碼 195
  5.1  圖和節點 195
  5.2  度量算法的復雜度 196
  5.3  二叉樹 196
  5.3.1  實現Go語言中的二叉樹 197
  5.3.2  二叉樹的優點 199
  5.4  Go語言中的哈希表 200
  5.4.1  實現Go語言中的哈希表 201
  5.4.2  實現查找功能 204
  5.4.3  哈希表的優點 204
  5.5  Go語言中的鏈表 205
  5.5.1  實現Go語言中的鏈表 206
  5.5.2  鏈表的優點 209
  5.6  Go語言中的雙向鏈表 210
  5.6.1  實現Go語言中的雙向鏈表 211
  5.6.2  雙向鏈表的優點 214
  5.7  Go語言中的隊列 214
  5.8  Go語言中的棧 218
  5.9  container包 221
  5.9.1  使用container/heap 221
  5.9.2  使用container/list 224
  5.9.3  使用container/ring 226
  5.10  在Go語言中生成隨機數 227
  5.11  生成安全的隨機數 233
  5.12  執行矩陣計算 234
  5.12.1  矩陣的加法和減法 235
  5.12.2  矩陣乘法 237
  5.12.3  矩陣的除法 241
  5.12.4  計算數組維度 246
  5.13  求解數獨謎題 247
  5.14  附加資源 251
  5.15  本章練習 251
  5.16  本章小結 252

第6章  Go包和函數 253
  6.1  Go包 253
  6.2  Go語言中的函數 254
  6.2.1  匿名函數 254
  6.2.2  返回多個值的函數 255
  6.2.3  命名函數的返回值 257
  6.2.4  包含指針參數的函數 258
  6.2.5  返回指針的函數 259
  6.2.6  返回其他函數的函數 260
  6.2.7  接收其他函數作為參數的函數 262
  6.2.8  可變參數函數 263
  6.3  開發自己的Go包 264
  6.3.1  編譯Go包 266
  6.3.2  私有變量和函數 267
  6.3.3  init()函數 267
  6.4  Go模塊 269
  6.4.1  創建並使用Go模塊 270
  6.4.2  使用同一Go模塊的不同版本 278
  6.4.3  Go模塊在Go語言中的存儲位置 279
  6.4.4  go mod vendor命令 280
  6.5  創建較好的Go包 281
  6.6  syscall包 282
  6.7  go/scanner、go/parser和go/token包 286
  6.7.1  go/ast包 287
  6.7.2  go/scanner包 287
  6.7.3  go/parser包 289
  6.7.4  操作示例 292
  6.7.5  利用給定的字符串長度查找變量名 293
  6.8  文本和HTML模板 298
  6.8.1  生成文本輸出 299
  6.8.2  構建HTML輸出結果 301
  6.9  附加資源 308
  6.10  練習 309
  6.11  本章小結 309

第7章  反射和接口 311
  7.1  類型方法 311
  7.2  Go接口 313
  7.3  編寫自己的接口 316
  7.3.1  使用Go接口 316
  7.3.2  使用switch語句和數據類型 318
  7.4  反射 320
  7.4.1  簡單的反射示例 321
  7.4.2  高級反射示例 323
  7.4.3  反射的缺點 326
  7.4.4  reflectwalk庫 326
  7.5  Go語言中的面向對象編程 329
  7.6  Git和GitHub簡介 332
  7.6.1  使用Git 332
  7.6.2  git status命令 333
  7.6.3  git pull命令 333
  7.6.4  git commit命令 333
  7.6.5  git push命令 334
  7.6

.6  與分支協同工作 334
  7.6.7  與文件協同工作 335
  7.6.8  .gitignore文件 336
  7.6.9  使用git diff命令 336
  7.6.10  與標簽協同工作 337
  7.6.11  git cherry-pick命令 338
  7.7  使用Delve進行調試 339
  7.8  附加資源 343
  7.9  本章練習 344
  7.10  本章小結 344

第3部分
第8章  UNIX系統編程 347
  8.1  UNIX進程 348
  8.2  flag包 348
  8.3  viper包 353
  8.3.1  簡單的viper示例 353
  8.3.2  從flag到viper包 354
  8.3.3  讀取JSON配置文件 356
  8.3.4  讀取YAML配置文件 358
  8.4  cobra包 360
  8.4.1  簡單的cobra示例 361
  8.4.2  創建命令行別名 366
  8.5  io.Reader和io.Writer接口 369
  8.6  bufio包 369
  8.7  讀取文本文件 370
  8.7.1  逐行讀取文本文件 370
  8.7.2  逐個單詞讀取文本文件 372
  8.7.3  逐個字符讀取文本文件 374
  8.7.4  從/dev/random中讀取 376
  8.8  讀取特定的數據量 377
  8.9  二進制格式的優點 379
  8.10  讀取CSV文件 380
  8.11  寫入文件中 383
  8.12  加載和保存磁盤上的數據 386
  8.13  再訪strings包 389
  8.14  bytes包 391
  8.15  文件權限 392
  8.16  處理UNIX信號 394
  8.16.1  處理兩個信號 394
  8.16.2  處理全部信號 397
  8.17  Go語言中的UNIX管道編程 399
  8.18  syscall.PtraceRegs 401
  8.19  跟蹤系統調用 403
  8.20  用戶ID和組ID 408
  8.21  Docker API和Go語言 409
  8.22  附加資源 412
  8.23  本章練習 413
  8.24  本章小結 413

第9章  Go語言中的並發編程—協程、通道和管道 415
  9.1  進程、線程和協程 415
  9.1.1  Go調度器 416
  9.1.2  並發和並行 416
  9.2  協程 417
  9.2.1  創建一個協程 417
  9.2.2  創建多個協程 418
  9.3  等待協程結束 420
  9.4  通道 424
  9.4.1  寫入通道 424
  9.4.2  從通道中讀取數據 426
  9.4.3  從關閉的通道中讀取 427
  9.4.4  作為函數參數的通道 428
  9.5  管道 429
  9.6  競態條件 433
  9.7  Go語言和Rust語言並發模型的比較 435
  9.8  Go語言和Erlang語言並發模型的比較 435
  9.9  附加資源 436
  9.10  本章練習 436
  9.11  本章小結 436

第10章  Go語言的並發性—高級話題 437
  10.1  再訪Go調度器 437
  10.2  select關鍵字 440
  10.3  協程超時 443
  10.3.1  協程超時第1部分 443
  10.3.2  協程超時第2部分 445
  10.4  再訪Go通道 447
  10.4.1  信號通道 448
  10.4.2  緩沖通道 448
  10.4.3  nil通道 450
  10.4.4  通道的通道 452
  10.4.5  指定協程的執行順序 454
  10.4.6  如何使用協程 457
  10.5  共享內存和共享變量 458
  10.5.1  sync.Mutex類型 458
  10.5.2  忘記解鎖互斥體 461
  10.5.3  sync.RWMutex類型 463
  10.5.4  atomic包 466
  10.5.5  基於協程的共享內存 468
  10.6  重訪Go語句 470
  10.7  緩存竟態條件 473
  10.8  context包 479
  10.8.1  context包的高級示例 483
  10.8.2  context包的另一個示例 488
  10.8.3  worker池 490
  10.9  附加資源 494
  10.10  本章練習 494
  10.11  本章小結 495

第11章  代碼測試、優化和分析 497
  11.1  優化 498
  11.2  優化Go代碼 499
  11.3  分析Go代碼 499
  11.3.1  net/http/pprof標準包 499
  11.3.2  簡單的分析示例 500
  11.3.3  方便的外部包 508
  11.3.4  Go分析器的Web界面 510
  11.4  go tool trace實用程序 514
  11.5  測試Go代碼 518
  11.5.1  針對現有Go代碼編寫測試 519
  11.5.2  測試代碼的覆蓋率 523
  11.6  利用數據庫後端測試HTTP服務器 526
  11.6.1  testing/quick包 533
  11.6.2  測試時間過長或無法結束 537
  11.7  Go代碼基準測試 540
  11.8  簡單的基準測試示例 540
  11.9  緩沖寫入的基準測試 546
  11.10  查找程序中不可訪問的Go代碼 551
  11.11  交叉編譯 552
  11.12  生成示例函數 554
  11.13  從Go代碼到機器代碼 556
  11.14  生成Go代碼文檔 559
  11.15  使用Docker鏡像 564
  11.16  附加資源 566
  11.17  本章練習 567
  11.18  本章小結 568

第12章  網絡編程基礎知識 569
  12.1  net/http、net和http.RoundTripper 569
  12.1.1  http.Response結構 570
  12.1.2  http.Request結構 570
  12.1.3  http.Transport結構 571
  12.2  TCP/IP 572
  12.3  IPv4和IPv6 573
  12.4  nc(1)命令行實用程序 573
  12.5  讀取網絡接口的配置 574
  12.6  在Go語言中執行DNS查找 578
  12.6.1  獲取域的NS記錄 581
  12.6.2  獲取域的MX記錄 582
  12.7  在Go語言中創建Web服務器 583
  12.7.1  使用atomic包 587
  12.7.2  分析一個HTTP服務器 589
  12.7.3  創建一個站點 594
  12.8  HTTP跟蹤機制 604
  12.9  在Go語言中創建一個Web客戶端 610
  12.10  HTTP連接超時 615
  12.10.1  SetDeadline()函數 617
  12.10.2  在服務器端設置超時時間 618
  12.10.3  其他超時方式 620
  12.11  Wireshark和tshark工具 621
  12.12  gRPC和Go 622
  12.12.1  定義接口定義文件 622
  12.12.2  gRPC客戶端 624
  12.12.3  gRPC服務器 626
  12.13  附加資源 628
  12.14  本章練習 629
  12.15  本章練習 630

第13章  網絡編程—構建自己的服務器和客戶端 631
  13.1  與HTTPS流量協同工作 631
  13.1.1  生成證書 631
  13.1.2  HTTPS客戶端 632
  13.1.3  簡單的HTTPS服務器 634
  13.1.4  開發TLS服務器和客戶端 636
  13.2  net標準包 639
  13.3  開發一個TCP客戶端 640
  13.4  開發一個TCP服務器 643
  13.5  開發一個UDP客戶端 648
  13.6  部署UDP服務器 650
  13.7  並發TCP服務器 653
  13.8  創建TCP/IP服務器的Docker鏡像 663
  13.9  遠程過程調用(RPC) 665
  13.9.1  RPC客戶端 666
  13.9.2  RPC服務器 667
  13.10  底層網絡編程 669
  13.11  本章資源 677
  13.12  本章練習 677
  13.13  本章小結 678

第14章  Go語言中的機器學習 679
  14.1  計算簡單的統計屬性 679
  14.2  回歸 683
  14.2.1  線性回歸 683
  14.2.2  實現線性回歸 684
  14.2.3  繪制數據 686
  14.3  分類 690
  14.4  聚類 694
  14.5  異常檢測 697
  14.6  神經網絡 700
  14.7  離群值分析 702
  14.8  與TensorFlow協同工作 705
  14.9  與Apache Kafka協同工作 710
  14.10  附加資源 715
  14.11  本章練習 716
  14.12  本章小結 716
  14.13  接下來的工作 716