內容簡介
本書主要內容包括Go語言簡介、開發環境準備、快速基礎入門、數學科學領域的計算、開發一個自己的日常命令行工具、檔案處理、數據格式分析與轉換、正則表達式、並發處理、數據採集和清理套用、網路服務端套用、Web伺服器、加密解密領域套用、網路提供的各種API、常用Go語言技術的示例與研究、實用函式實例等。安排了大量實例代碼,介紹相關編程知識。
圖書目錄
目 錄
第1章 Go語言簡介 1
1.1 Go語言的發展歷史 1
1.2 Go語言的主要特點 1
第2章 開發環境準備 4
2.1 安裝Go語言 4
2.1.1 Windows系統下安裝Go語言 4
2.1.2 Mac OS X系統下安裝Go語言 8
2.1.3 Linux系統下安裝Go語言 8
2.2 打造更舒適的開發環境 9
2.2.1 修改Windows資源管理器的一些顯示設定 9
2.2.2 命令提示符CMD的替代方案 9
2.2.3 文本檔案編輯器 11
2.3 Go語言開發工具的選擇 11
2.3.1 LiteIDE 11
2.3.2 Visual Studio Code加Go語言外掛程式 11
2.3.3 其他開發工具 14
第3章 Go語言快速入門 15
3.1 初識Go語言——編寫、編譯和運行 15
3.1.1 怎樣輸入Go語言程式 15
3.1.2 怎樣編譯Go語言程式 17
3.1.3 怎樣執行Go語言程式 18
3.1.4 怎樣查看Go語言的文檔 19
3.2 Go語言程式的組織 20
3.2.1 Go語言中程式檔案的組織方式 20
3.2.2 非執行包與包的引用 22
3.2.3 自己編寫非執行包 23
3.2.4 非執行包名與目錄的關係 24
3.2.5 用多級子目錄組織包結構 25
3.3 關鍵字等語言要素 26
3.4 變數 26
3.4.1 變數的基本概念 26
3.4.2 浮點數類型的變數 28
3.4.3 字元串類型的變數 29
3.4.4 布爾類型的變數 29
3.4.5 變數的命名 30
3.4.6 變數聲明和賦值的簡化形式 31
3.4.7 複合類型的變數 32
3.4.8 變數類型的轉換 34
3.4.9 指針類型的變數 35
3.4.10 變數的零值 36
3.5 表達式 37
3.6 函式(方法) 37
3.7 自定義數據類型 40
3.8 面向對象編程 42
3.9 條件判斷與分支 45
3.10 循環 46
3.11 並發處理:Go例程 48
3.12 注釋 49
3.13 程式編譯或運行時出現錯誤 50
3.14 總結的代碼 51
第4章 Go語言的基本語法與開發基礎 52
4.1 Go語言語法要素與代碼規範 52
4.1.1 檔案和字元串編碼 52
4.1.2 語句、代碼塊與執行順序 53
4.1.3 語句分隔 53
4.1.4 語法記號 53
4.2 代碼格式化工具gofmt 54
4.3 常用的輔助性內置函式 55
4.3.1 內置的輸出信息函式print與println 55
4.3.2 獲取數據長度的len函式 56
4.3.3 獲取變數容量的cap函式 57
4.3.4 用於複合類型數據的操作函式 57
4.3.5 用於處理異常的函式 58
4.4 格式化輸出函式fmt.Printf 58
4.4.1 整數格式化符%d 60
4.4.2 十六進制格式化符%x和%X 61
4.4.3 二進制格式化符%b 62
4.4.4 浮點數格式化符%f 62
4.4.5 其他浮點數格式化符 63
4.4.6 布爾類型的格式化符%t 64
4.4.7 Unicode碼相關格式化符%c、%q和%U 64
4.4.8 字元串格式化符%s 65
4.4.9 指針格式化符%p 66
4.4.10 萬能格式化符 %v 66
4.4.11 輸出數值類型的格式化符%T 68
4.4.12 輸出%字元本身 68
4.5 獲取和使用第三方包 68
4.6 定義和使用常量 70
4.7 變數、函式等標識符聲明的作用範圍 72
4.8 tools包——編寫自己的函式館 74
第5章 用Go語言進行數學、科學領域的計算 76
5.1 表達式 76
5.1.1 最簡單的表達式——單個數值 76
5.1.2 操作符在表達式中的作用 76
5.1.3 函式在表達式中的作用 79
5.1.4 表達式的組合與計算的優先權 80
5.1.5 表達式中數據類型的一致性要求 81
5.2 用表達式進行數學計算 81
5.2.1 體重指數 81
5.2.2 用表達式計算體重指數 82
5.2.3 使用命令行參數傳入體重和身高的變數值 83
5.3 利用系統自帶的數學庫進行計算 85
5.3.1 查閱Go語言中的參考文檔 85
5.3.2 使用math.Pow函式進行平方計算 86
5.3.3 用math/rand包生成隨機數 87
5.4 用Go語言進行科學計算 90
5.4.1 向量與餘弦相似度概念簡介 90
5.4.2 計算向量餘弦相似度的函式 91
5.5 使用math/big包避免計算過程中超大數溢出 93
5.5.1 big包的基本使用方法 93
5.5.2 用big包改進餘弦相似度計算函式 94
5.6 計算中的異常處理 95
5.6.1 Go語言中的匿名函式 95
5.6.2 Go語言的延遲處理機制 97
5.6.3 Go語言的異常處理機制 98
5.6.4 處理計算中的異常 100
5.6.5 Go語言中異常的傳遞順序 107
5.6.6 使用runtime庫輸出更多的異常信息 108
5.7 使用第三方包進行更複雜的數學計算 109
5.7.1 Gonum包中用於矩陣運算的mat子包簡介 109
5.7.2 矩陣乘法的計算過程 109
5.7.3 用gonum/mat子包實現矩陣乘法 110
第6章 用Go語言開發一個命令行工具 113
6.1 命令行工具簡介 113
6.2 典型命令行工具的架構 113
6.3 基本的命令行工具clix程式框架 114
6.4 Go語言中的switch語句 115
6.5 clix的第一個命令:version 118
6.6 增加體重指數計算命令calbmi 118
6.6.1 tools包中增加判斷起始子字元串的函式 118
6.6.2 子字元串的截取 119
6.6.3 tools包中增加判斷標誌參數的函式 120
6.6.4 編寫clix中的calbmi命令 120
6.6.5 增加命令行開關標誌參數 121
6.6.6 使用flag包來分析命令行參數 123
6.7 第三個命令:數字排序 125
6.7.1 循環進階 125
6.7.2 冒泡法排序 130
6.7.3 用雙重循環實現冒泡法排序 131
6.7.4 命令行參數中傳入數字序列 131
6.7.5 在clix程式中加入冒泡法排序的命令 133
6.8 Go語言中對典型代碼邏輯結構的支持 133
6.8.1 基本的代碼結構 134
6.8.2 利用標籤跳出或繼續外層循環 134
6.8.3 goto語句無條件跳轉 136
6.8.4 遞歸(調用自身函式) 137
第7章 Go語言中的字元串處理 138
7.1 字元串相關的基礎知識 138
7.1.1 字元串的基本概念 138
7.1.2 byte、uint8和int8類型 138
7.1.3 byte類型的切片([]byte)與string 140
7.1.4 字元串的基本操作:取長度、連線、截取等 140
7.1.5 用雙引號或反引號括起字元串的區別 141
7.2 字元串支持多語言編碼的特殊處理 141
7.2.1 UTF-8編碼 142
7.2.2 rune類型和rune類型切片 143
7.2.3 用rune對字元串進行遍歷 144
7.3 常見的字元串操作 145
7.3.1 判斷字元串中是否含有某個子串 145
7.3.2 獲取字元串中子串的位置 146
7.3.3 獲取字元串中子串第n次出現的位置 146
7.3.4 統計字元串中子串出現的次數 148
7.3.5 判斷字元串的起始或結尾子串 148
7.3.6 比較兩個字元串 149
7.3.7 去除字元串首尾空白或其他字元 150
7.3.8 替換字元串中的子串 152
7.3.9 字元串大小寫的轉換 152
7.3.10 切分字元串 153
7.3.11 合併字元串切片 154
7.3.12 生成重複子串組成的字元串 155
7.3.13 幾個Unicode操作 155
7.4 高級字元串操作 157
7.4.1 生成隨機字元串 157
7.4.2 用strings.Builder實現不斷增長的字元串 159
7.4.3 用於讀取字元串內容的strings.Reader 161
7.4.4 字元串與數字的相互轉化 162
7.4.5 用fmt.Sprintf實現靈活的字元串處理 169
7.4.6 用fmt.Sscanf從字元串中讀取信息 170
第8章 Go語言中的正則表達式 173
8.1 正則表達式的基本概念與用法 173
8.1.1 用正則表達式判斷字元串是否含有符合一定規則的子串 173
8.1.2 用正則表達式從字元串中提取符合一定規則的子串 174
8.1.3 用通配符“.”匹配任意字元 175
8.1.4 貪婪與非貪婪匹配 176
8.1.5 分組提取子串 177
8.1.6 提取所有符合條件的帶捕獲組的匹配結果 178
8.1.7 替換符合正則表達式的子串 179
8.1.8 轉義字元 180
8.2 正則表達式進階知識 181
8.2.1 單個字元的表達 181
8.2.2 表達字元出現的次數(數量) 184
8.2.3 非字元匹配(位置匹配) 185
8.2.4 正則表達式中使用標誌位進行設定 186
8.2.5 可選子串匹配 187
8.2.6 非捕獲組 187
8.2.7 獲取匹配到子串的索引位置 188
8.2.8 用正則表達式分割字元串 188
8.2.9 判斷整個字元串是否匹配正則表達式 189
8.2.10 按位元組進行正則表達式匹配 189
第9章 Go語言檔案處理 190
9.1 Go語言中文本檔案的處理 190
9.1.1 文本檔案的編碼 190
9.1.2 文本檔案的打開、讀取與關閉等基本操作 191
9.1.3 從較大的文本檔案中讀取完整內容 193
9.1.4 較簡單的讀取完整文本的方法 194
9.1.5 更簡單的讀取完整文本的方法 195
9.1.6 從文本檔案中讀取指定數量的行 196
9.1.7 將字元串寫入文本檔案 198
9.1.8 向已有的文本檔案中追加內容 199
9.1.9 用移動檔案指針的方法向檔案中追加內容 200
9.1.10 檔案、目錄的其他基本操作 201
9.1.11 文本檔案編碼轉換 208
9.1.12 文本排序 215
9.1.13 超大文本檔案排序 218
9.1.14 文本查重、去重 219
9.2 Go語言中二進制檔案的處理 219
9.2.1 Go語言中用二進制檔案存儲數據 219
9.2.2 自定義檔案格式存儲大量數據記錄 224
9.3 檔案處理總結 227
第10章 Go語言中數據格式的分析與轉換 229
10.1 常見的數據交換格式 229
10.2 XML格式的處理 229
10.2.1 將數據序列化成XML格式 229
10.2.2 將XML格式的文本反序列化 232
10.2.3 省略欄位、字元欄位和原始XML文本欄位 234
10.2.4 自行控制某數據類型的XML序列化/反序列化 235
10.3 JSON格式的處理 237
10.3.1 將數據序列化成JSON格式 237
10.3.2 將JSON格式的文本反序列化 239
10.3.3 JSON序列化/反序列化時使用描述字元串 240
10.3.4 自行控制自定義數據類型的JSON序列化/反序列化 242
10.3.5 用空接口類型實現複雜結構的JSON序列化 244
10.3.6 JSON解析中空接口類型的套用 246
10.3.7 使用第三方包進行JSON格式的序列化與反序列化 248
第11章 Go語言的並發處理 250
11.1 Go語言並發編程基礎 250
11.2 並發處理時的共享衝突 253
11.3 使用通道類型實現安全的數據共享 255
11.4 使用通道作為數據訪問的令牌 257
11.5 使用通道實現多任務的歸併 258
11.6 用select實現多通道的歸併 260
11.7 select中實現逾時中止 262
11.8 用單向通道自定義逾時函式 263
11.9 使用sync包進行傳統的並發處理 265
11.9.1 用sync.WaitGroup實現goroutine歸併 266
11.9.2 用鎖(互斥量)實現goroutine同步 267
11.9.3 用讀寫鎖(互斥量)做“多讀少寫”型並發任務 268
第12章 Go語言進行資料庫開發 270
12.1 Go語言進行資料庫開發的一般方式 270
12.2 安裝SQLite資料庫驅動 270
12.3 基本的資料庫操作——新建庫表、插入記錄和查詢 270
12.4 刪除記錄、準備SQL查詢等操作 273
12.5 獲取記錄條數、刪除庫表等操作 275
12.6 SQL型資料庫開發總結 276
12.7 NoSQL型資料庫開發示例 276
第13章 Go語言進行網路服務的開發 280
13.1 C/S架構與B/S架構的概念 280
13.2 基於Socket通信的客戶端/伺服器模式 280
13.3 基於TCP的Socket客戶端/伺服器系統 281
13.4 典型的Socket伺服器的例子 281
13.5 典型的Socket客戶端的例子 283
13.6 典型的UDP伺服器的例子 286
13.7 典型的UDP客戶端的例子 287
13.8 用Go語言搭建簡單的Web伺服器 288
13.9 搭建簡單的檔案伺服器 290
13.10 搭建靜態檔案型的Web網站伺服器 290
13.11 混合不同方式的Web伺服器 293
13.12 搭建提供網路接口服務的API伺服器 294
13.13 Web伺服器的路由管理 297
13.14 動態網頁的生成 299
13.15 提供HTTPS方式訪問 302
13.16 第三方的Web開發包 303
13.17 Go語言中實現Web客戶端 305
第14章 Go語言進行繪圖和圖像處理 307
14.1 基本的點繪圖 307
14.2 繪製曲線圖 308
14.3 繪製有填充色的形狀 311
14.4 實現漸變的填充色 314
14.5 使用第三方庫更方便實現複雜圖形繪製 318
14.6 繪製平滑曲線 321
14.7 在圖片上繪製文字 323
14.8 使用freetype包進行文字繪製 326
14.9 用image/draw包實現靈活的圖像處理 328
14.9.1 實現圖片區域複製 328
14.9.2 用draw.Draw函式進行顏色填充 333
14.9.3 image包中的幾個重要對象 333
14.9.4 用顏色填充繪製矩形框 334
14.9.5 將圖片變成全透明 334
14.9.6 複製原圖中的區域到目標圖中另一個區域 335
14.9.7 使用蒙版複製不規則區域 335
14.9.8 自定義image.Image類型的蒙版對象 337
14.9.9 圖片色彩空間的轉換 338
14.10 在Web中輸出圖像 339
第15章 Go語言進行圖形界面開發 343
15.1 使用Qt開發圖形界面 343
15.1.1 Go結合Qt開發環境的搭建 343
15.1.2 Go結合Qt開發基礎示例 344
15.1.3 部署therecipe/qt示例程式 346
15.1.4 在goroutine中安全操作圖形界面 347
15.2 使用govcl包開發圖形界面 355
15.2.1 使用govcl包開發圖形界面的基礎示例 355
15.2.2 govcl包中避免並發界面操作衝突 358
15.3 Go語言中開發基於Web的圖形界面 360
第16章 Go語言的反射機制 361
16.1 用反射機制獲取基本類型的信息 361
16.2 用反射獲取複雜類型的信息 362
16.3 函式的傳值與傳引用 363
16.4 用反射獲取結構類型(對象)的成員信息 364
16.5 用反射獲取空接口類型數據的實際類型 366
16.6 用Kind函式獲取基類型 367
16.7 判斷對象是否實現了某方法或接口 370
16.8 動態調用對象的方法 372
16.9 修改數據 374
16.10 實例:JSON處理 375
第17章 Go語言的測試與性能 378
17.1 功能測試 378
17.1.1 基本的功能測試 378
17.1.2 功能測試不通過的情況 379
17.1.3 立即中止測試用例函式 380
17.1.4 簡化的中止測試用例函式 381
17.1.5 跳過測試用例 381
17.1.6 進行並發測試 382
17.1.7 指定運行的測試用例 383
17.2 性能測試 384
17.2.1 基本的性能測試 384
17.2.2 根據性能測試結果進行最佳化和比對 386
17.2.3 指定性能測試的時長 387
17.2.4 手動控制測試計時 388
17.2.5 測試記憶體分配的情況 388
第18章 Go語言與其他語言的結合運用 390
18.1 Cgo 390
18.1.1 Go語言中直接編寫C語言代碼 390
18.1.2 Go語言中調用C語言檔案中的代碼 393
18.1.3 Go語言中編寫函式供C語言調用 394
18.1.4 Cgo的一些局限 396
18.2 Go語言中運行其他腳本語言 396
18.2.1 Tengo腳本語言 396
18.2.2 實現JavaScript虛擬機的otto包 398
18.2.3 實現Lua語言虛擬機的go-lua包 399
18.3 Go語言中直接執行其他程式或調用系統命令 400
18.3.1 調用應用程式並讀取其輸出 400
18.3.2 使用管道從程式的輸出中接收信息 402
18.4 Go語言與WebAssembly 404