本書從實踐出發(fā)講解Go語言編程的基礎和進階知識。全書共分為14章,第1~4章講述Go的基礎知識,如基礎語法、內(nèi)置庫的使用等,第5~14章介紹編寫圖表庫、實現(xiàn)命令行工具、網(wǎng)絡爬蟲Web編程、GraphQL編程和面向接口編程等,將Go的核心知識和應用拆分到不同的應用場景中進行講解。
本書適合對Go語言的應用已經(jīng)有一定基礎,并希望能夠在Web開發(fā)方面、接口編程方面結(jié)合Go語言來實現(xiàn)進階學習的技術人員學習和參考。
我剛學編程的時候,經(jīng)常找大量的相關圖書進行學習,有些圖書確實很專業(yè),詳細地介紹了編程語言的各種語法細節(jié),但是初學者甚至有一定編程基礎的人還是會有困惑:這些語法究竟該如何應用,具體的應用場景有哪些?往往因為無法解決這些困惑,初學編程或者經(jīng)驗不是很豐富的人輕易就放棄了,終還是沒能學會編程。
后來我工作了,接觸的項目越來越多,知道了越來越多的實際應用場景,對這些問題也就頓悟了。解決當年的困惑是編寫本書的初衷。本書以豐富的實例對編程過程中高頻出現(xiàn)的應用場景一一進行講解,比如圖表庫、開源庫、命令行客戶端、網(wǎng)絡爬蟲、Web 編程等。
本書為了照顧初學Go語言的讀者,用前4章介紹Go語言的基礎知識,聚焦在內(nèi)置庫的使用上。接下來的8章側(cè)重于演示使用Go語言實現(xiàn)各種功能應用,如果讀者從事編程工作,相信這些實例在以后的工作中會經(jīng)常出現(xiàn)。對這些實例側(cè)重介紹設計思路和具體解決方案,比如網(wǎng)絡爬蟲有不同的獲取網(wǎng)頁源代碼的方法、不同的解析網(wǎng)頁的方法、不同的分析網(wǎng)絡請求的方法……書中一一進行了詳細的介紹。希望這些實例能讓讀者少走彎路,掌握解決問題的思路和方法。后一章介紹Go開發(fā)的路線。
本書的學習建議是:先掌握Go語言相關的基礎知識,對編程有一定的感知能力后,再著手學習具體的開發(fā)實例。每個實例相互獨立,讀者可以按需學習,比如:對Web開發(fā)感興趣,可以看Web開發(fā)相關的環(huán)境和實例;對面向API編程感興趣,可以看面向API編程相關的實例。
本書的資源文件可以登錄機械工業(yè)出版社華章公司的網(wǎng)站(www.hzbook.com)下載,方法是:搜索到本書,然后在頁面上的資源下載模塊下載即可。如果下載有問題,請發(fā)送電子郵件至booksaga@126.com。
本書在構(gòu)思和寫作的過程中得到了諸多老師、同行、同事的幫助,在此表示感謝。感謝互聯(lián)網(wǎng)平臺,諸多的分享平臺使得我們學習知識的途徑大大增加,每一位認真分享、學習的人都可以在互聯(lián)網(wǎng)上發(fā)光發(fā)熱。在寫書的過程中發(fā)生了很多事,感謝家人對我的支持,感謝編輯的認真負責,大家的共同努力才使本書得以面世。
謝 偉
2021年3月23日
前言
第1章 概述 1
1.1 Go語言的特性 1
1.2 開發(fā)環(huán)境的搭建 2
1.2.1 下載與目標操作系統(tǒng)匹配的安裝包 2
1.2.2 設置環(huán)境變量 2
1.2.3 集成開發(fā)環(huán)境的選擇 4
1.2.4 編寫個Go程序 4
1.3 Go命令行和項目結(jié)構(gòu) 5
1.3.1 需要GOPATH支持的方式 5
1.3.2 不需要GOPATH支持的方式 5
1.4 本章小結(jié) 5
第2章 基礎知識 6
2.1 引子 6
2.2 了解Go語言的基本語法 7
2.2.1 變量 7
2.2.2 聲明與賦值 7
2.2.3 多個變量的聲明與賦值 8
2.2.4 變量的作用域 8
2.2.5 常量 9
2.2.6 基本數(shù)據(jù)類型 9
2.2.7 類型轉(zhuǎn)換 12
2.2.8 自定義類型 12
2.2.9 函數(shù) 13
2.2.10 流程控制 15
2.2.11 結(jié)構(gòu)體 19
2.2.12 接口 21
2.3 本章小結(jié) 22
第3章 數(shù)據(jù)操作 23
3.1 變量 23
3.1.1 顯式聲明與隱式聲明 23
3.1.2 組織多個變量 24
3.1.3 變量的命名應遵循的原則 25
3.2 運算 26
3.2.1 算術運算 26
3.2.2 邏輯運算 27
3.3 數(shù)組和切片 28
3.4 字典 29
3.5 結(jié)構(gòu)體 30
3.5.1 匿名字段 31
3.5.2 小結(jié) 32
3.6 接口 33
3.6.1 error 33
3.6.2 Marshaler 34
3.7 庫(包)管理 36
3.7.1 庫(包)的導入 36
3.7.2 下載庫(包) 36
3.8 項目組織的結(jié)構(gòu) 37
3.8.1 領域驅(qū)動的方式 37
3.8.2 業(yè)務驅(qū)動的方式 38
3.9 本章小結(jié) 38
第4章 內(nèi)置庫的常用操作 39
4.1 字符串 39
4.2 bytes 45
4.3 json 47
4.4 io/bufio 48
4.5 fmt 51
4.6 strconv 55
4.7 time 57
4.8 regexp 59
4.9 log 62
4.10 reflect/unsafe 65
4.11 os/path/filepath 69
4.12 unicode 78
4.13 flag 80
4.14 net/url 84
4.15 net/http 87
4.16 sort 94
4.17 error 97
4.18 本章小結(jié) 99
第5章 編寫圖表庫 100
5.1 常見的開源圖表庫 100
5.1.1 ECharts 100
5.1.2 BizCharts 103
5.1.3 chart.js 105
5.1.4 HighCharts 106
5.1.5 小結(jié) 108
5.2 模板引擎的使用 108
5.3 使用模板引擎構(gòu)建圖表 111
5.4 基于chart.js構(gòu)建圖表庫go-chart 121
5.4.1 項目組織結(jié)構(gòu) 122
5.4.2 模板文件 123
5.4.3 基礎數(shù)據(jù) 124
5.4.4 圖表類型 128
5.5 本章小結(jié) 132
第6章 編寫測試 133
6.1 單元測試 133
6.2 基本的使用 134
6.2.1 常見用法 134
6.2.2 樣本測試 135
6.2.3 SetUp/TearDown 136
6.3 表格驅(qū)動法測試 136
6.4 第三方庫goconvey 137
6.5 解決依賴性問題 140
6.5.1 函數(shù)依賴關系 140
6.5.2 數(shù)據(jù)庫的依賴 143
6.6 性能測試 148
6.7 本章小結(jié) 150
第7章 網(wǎng)絡爬蟲 151
7.1 網(wǎng)絡爬蟲是什么 151
7.2 網(wǎng)頁的基本組成 152
7.2.1 HTML 153
7.2.2 Chrome開發(fā)者工具的使用 155
7.2.3 小結(jié) 162
7.3 原生庫解析HTML網(wǎng)頁 163
7.4 正則表達式解析網(wǎng)頁 165
7.5 網(wǎng)絡爬蟲的流程 167
7.6 網(wǎng)頁源代碼的獲取 168
7.6.1 原生net/http庫 168
7.6.2 Selenium瀏覽器自動化測試 169
7.6.3 Chromedp渲染 172
7.6.4 小結(jié) 174
7.7 CSS選擇器解析網(wǎng)頁 174
7.7.1 語法 174
7.7.2 下載安裝 177
7.7.3 示例 177
7.7.4 小結(jié) 185
7.8 XPath路徑表達式解析網(wǎng)頁 185
7.8.1 語法 185
7.8.2 下載安裝 187
7.8.3 示例 188
7.8.4 小結(jié) 192
7.9 JSON數(shù)據(jù)解析 192
7.9.1 JSON數(shù)據(jù) 192
7.9.2 下載安裝 194
7.9.3 v2ex社區(qū)實例 195
7.9.4 貓眼票房實例 197
7.10 App端數(shù)據(jù)的獲取 201
7.10.1 Charles的使用 201
7.10.2 Mitmproxy的使用 203
7.10.3 小結(jié) 205
7.11 數(shù)據(jù)存儲 206
7.11.1 百度搜索指數(shù)實例 206
7.11.2 持久化存儲 211
7.11.3 數(shù)據(jù)庫的形式 214
7.12 本章小結(jié) 218
第8章 實現(xiàn)命令行工具 219
8.1 優(yōu)秀的命令行工具的特點 219
8.1.1 Docker 219
8.1.2 Go 221
8.2 命令行工具需要處理的內(nèi)容 223
8.3 Go實現(xiàn)命令行的幾種方式 223
8.3.1 內(nèi)置的os庫 224
8.3.2 內(nèi)置的flag庫 226
8.3.3 使用第三方庫cobra實現(xiàn)gitcli 233
8.4 本章小結(jié) 250
第9章 動手實現(xiàn)一個庫 251
9.1 解決什么問題 251
9.2 解決方案 253
9.2.1 手動處理 253
9.2.2 參考別人的思路 254
9.2.3 自己的思路 258
9.2.4 持續(xù)集成 264
9.2.5 拓展 273
9.3 本章小結(jié) 273
第10章 Web服務 275
10.1 使用net/http構(gòu)建簡易的Web服務 275
10.1.1 啟動Web服務 275
10.1.2 目標 281
10.1.3 模板的使用 281
10.1.4 內(nèi)容開發(fā) 286
10.2 使用net/http構(gòu)建愛鮮蜂Web服務 317
10.2.1 需求流程梳理 318
10.2.2 模型設計 319
10.2.3 代碼開發(fā) 325
10.2.4 項目組織結(jié)構(gòu) 339
10.3 本章小結(jié) 375
第11章 Web開發(fā)手冊 376
11.1 再談HTTP 376
11.2 設計RESTful API 377
11.2.1 資源的訪問操作 378
11.2.2 路由的設計 379
11.2.3 參數(shù) 379
11.2.4 參數(shù)檢驗 382
11.2.5 響應信息 383
11.3 數(shù)據(jù)模型 385
11.3.1 GORM方案 387
11.3.2 XORM方案 387
11.3.3 小結(jié) 390
11.4 中間件 391
11.4.1 Gin中間件 394
11.4.2 Echo中間件 395
11.4.3 Iris中間件 396
11.4.4 小結(jié) 396
11.5 響應信息 396
11.5.1 正確時的響應信息 397
11.5.2 錯誤時的響應信息 399
11.5.3 小結(jié) 399
11.6 項目組織結(jié)構(gòu) 400
11.7 代碼管理和托管 402
11.8 Make構(gòu)建工具 403
11.8.1 語法規(guī)范 403
11.8.2 Go項目的命令 405
11.9 容器化部署 406
11.9.1 Docker容器的使用 407
11.9.2 小結(jié) 408
11.10 自動CI/CD 408
11.11 本章小結(jié) 413
第12章 面向接口編程 414
12.1 開源 414
12.2 搜索引擎的基本使用 415
12.2.1 下載并安裝 416
12.2.2 docker-compose配置文件 416
12.2.3 查看安裝是否成功 417
12.3 客戶端go-elasticsearch的使用 418
12.3.1 下載并安裝 418
12.3.2 基本的使用 419
12.4 項目組織的形式 420
12.5 面向接口編程 421
12.6 自己實現(xiàn),學為己用 432
12.7 本章小結(jié) 441
第13章 Go學習路徑 442
13.1 內(nèi)置庫 442
13.1.1 訪問官方文檔 442
13.1.2 文檔的組織 442
13.1.3 閱讀內(nèi)置庫 444
13.2 版本管理 445
13.2.1 初始化 445
13.2.2 下載 446
13.2.3 移除不需要的模塊 446
13.3 測試驅(qū)動開發(fā) 446
13.4 命令行 447
13.5 Web開發(fā) 447
13.6 SQL與ORM 448
13.7 系統(tǒng)工程 448
13.7.1 需求討論 448
13.7.2 迭代開發(fā)/測試 448
13.7.3 代碼版本管理 449
13.7.4 持續(xù)集成(CI) 449
13.7.5 持續(xù)部署(CD) 450
13.7.6 多組件部署 450
13.7.7 監(jiān)控運維 450