Go語言編程指南 Go Fundamentals: Gopher Guides
[美]馬克·貝茨(Mark Bates)
- 出版商: 人民郵電
- 出版日期: 2024-06-01
- 售價: $719
- 貴賓價: 9.5 折 $683
- 語言: 簡體中文
- 頁數: 443
- 裝訂: 平裝
- ISBN: 7115636214
- ISBN-13: 9787115636218
- 此書翻譯自: Go Fundamentals: Gopher Guides (Paperback)
立即出貨
買這商品的人也買了...
-
$594$564 -
$768$730 -
$510Redis 高手心法
相關主題
商品描述
本書涵蓋了 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