本書從實(shí)踐出發(fā)講解Go語言編程的基礎(chǔ)和進(jìn)階知識。全書共分為14章,第1~4章講述Go的基礎(chǔ)知識,如基礎(chǔ)語法、內(nèi)置庫的使用等,第5~14章介紹編寫圖表庫、實(shí)現(xiàn)命令行工具、網(wǎng)絡(luò)爬蟲Web編程、GraphQL編程和面向接口編程等,將Go的核心知識和應(yīng)用拆分到不同的應(yīng)用場景中進(jìn)行講解。
本書適合對Go語言的應(yīng)用已經(jīng)有一定基礎(chǔ),并希望能夠在Web開發(fā)方面、接口編程方面結(jié)合Go語言來實(shí)現(xiàn)進(jìn)階學(xué)習(xí)的技術(shù)人員學(xué)習(xí)和參考。
我剛學(xué)編程的時候,經(jīng)常找大量的相關(guān)圖書進(jìn)行學(xué)習(xí),有些圖書確實(shí)很專業(yè),詳細(xì)地介紹了編程語言的各種語法細(xì)節(jié),但是初學(xué)者甚至有一定編程基礎(chǔ)的人還是會有困惑:這些語法究竟該如何應(yīng)用,具體的應(yīng)用場景有哪些?往往因?yàn)闊o法解決這些困惑,初學(xué)編程或者經(jīng)驗(yàn)不是很豐富的人輕易就放棄了,終還是沒能學(xué)會編程。
后來我工作了,接觸的項(xiàng)目越來越多,知道了越來越多的實(shí)際應(yīng)用場景,對這些問題也就頓悟了。解決當(dāng)年的困惑是編寫本書的初衷。本書以豐富的實(shí)例對編程過程中高頻出現(xiàn)的應(yīng)用場景一一進(jìn)行講解,比如圖表庫、開源庫、命令行客戶端、網(wǎng)絡(luò)爬蟲、Web 編程等。
本書為了照顧初學(xué)Go語言的讀者,用前4章介紹Go語言的基礎(chǔ)知識,聚焦在內(nèi)置庫的使用上。接下來的8章側(cè)重于演示使用Go語言實(shí)現(xiàn)各種功能應(yīng)用,如果讀者從事編程工作,相信這些實(shí)例在以后的工作中會經(jīng)常出現(xiàn)。對這些實(shí)例側(cè)重介紹設(shè)計思路和具體解決方案,比如網(wǎng)絡(luò)爬蟲有不同的獲取網(wǎng)頁源代碼的方法、不同的解析網(wǎng)頁的方法、不同的分析網(wǎng)絡(luò)請求的方法……書中一一進(jìn)行了詳細(xì)的介紹。希望這些實(shí)例能讓讀者少走彎路,掌握解決問題的思路和方法。后一章介紹Go開發(fā)的路線。
本書的學(xué)習(xí)建議是:先掌握Go語言相關(guān)的基礎(chǔ)知識,對編程有一定的感知能力后,再著手學(xué)習(xí)具體的開發(fā)實(shí)例。每個實(shí)例相互獨(dú)立,讀者可以按需學(xué)習(xí),比如:對Web開發(fā)感興趣,可以看Web開發(fā)相關(guān)的環(huán)境和實(shí)例;對面向API編程感興趣,可以看面向API編程相關(guān)的實(shí)例。
本書的資源文件可以登錄機(jī)械工業(yè)出版社華章公司的網(wǎng)站(www.hzbook.com)下載,方法是:搜索到本書,然后在頁面上的資源下載模塊下載即可。如果下載有問題,請發(fā)送電子郵件至booksaga@126.com。
本書在構(gòu)思和寫作的過程中得到了諸多老師、同行、同事的幫助,在此表示感謝。感謝互聯(lián)網(wǎng)平臺,諸多的分享平臺使得我們學(xué)習(xí)知識的途徑大大增加,每一位認(rèn)真分享、學(xué)習(xí)的人都可以在互聯(lián)網(wǎng)上發(fā)光發(fā)熱。在寫書的過程中發(fā)生了很多事,感謝家人對我的支持,感謝編輯的認(rèn)真負(fù)責(zé),大家的共同努力才使本書得以面世。
謝 偉
2021年3月23日
前言
第1章 概述 1
1.1 Go語言的特性 1
1.2 開發(fā)環(huán)境的搭建 2
1.2.1 下載與目標(biāo)操作系統(tǒng)匹配的安裝包 2
1.2.2 設(shè)置環(huán)境變量 2
1.2.3 集成開發(fā)環(huán)境的選擇 4
1.2.4 編寫個Go程序 4
1.3 Go命令行和項(xiàng)目結(jié)構(gòu) 5
1.3.1 需要GOPATH支持的方式 5
1.3.2 不需要GOPATH支持的方式 5
1.4 本章小結(jié) 5
第2章 基礎(chǔ)知識 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 變量的命名應(yīng)遵循的原則 25
3.2 運(yùn)算 26
3.2.1 算術(shù)運(yùn)算 26
3.2.2 邏輯運(yùn)算 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 庫(包)的導(dǎo)入 36
3.7.2 下載庫(包) 36
3.8 項(xiàng)目組織的結(jié)構(gòu) 37
3.8.1 領(lǐng)域驅(qū)動的方式 37
3.8.2 業(yè)務(wù)驅(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 項(xiàng)目組織結(jié)構(gòu) 122
5.4.2 模板文件 123
5.4.3 基礎(chǔ)數(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ù)依賴關(guān)系 140
6.5.2 數(shù)據(jù)庫的依賴 143
6.6 性能測試 148
6.7 本章小結(jié) 150
第7章 網(wǎng)絡(luò)爬蟲 151
7.1 網(wǎng)絡(luò)爬蟲是什么 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 正則表達(dá)式解析網(wǎng)頁 165
7.5 網(wǎng)絡(luò)爬蟲的流程 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路徑表達(dá)式解析網(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ū)實(shí)例 195
7.9.4 貓眼票房實(shí)例 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ù)實(shí)例 206
7.11.2 持久化存儲 211
7.11.3 數(shù)據(jù)庫的形式 214
7.12 本章小結(jié) 218
第8章 實(shí)現(xiàn)命令行工具 219
8.1 優(yōu)秀的命令行工具的特點(diǎn) 219
8.1.1 Docker 219
8.1.2 Go 221
8.2 命令行工具需要處理的內(nèi)容 223
8.3 Go實(shí)現(xiàn)命令行的幾種方式 223
8.3.1 內(nèi)置的os庫 224
8.3.2 內(nèi)置的flag庫 226
8.3.3 使用第三方庫cobra實(shí)現(xiàn)gitcli 233
8.4 本章小結(jié) 250
第9章 動手實(shí)現(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服務(wù) 275
10.1 使用net/http構(gòu)建簡易的Web服務(wù) 275
10.1.1 啟動Web服務(wù) 275
10.1.2 目標(biāo) 281
10.1.3 模板的使用 281
10.1.4 內(nèi)容開發(fā) 286
10.2 使用net/http構(gòu)建愛鮮蜂Web服務(wù) 317
10.2.1 需求流程梳理 318
10.2.2 模型設(shè)計 319
10.2.3 代碼開發(fā) 325
10.2.4 項(xiàng)目組織結(jié)構(gòu) 339
10.3 本章小結(jié) 375
第11章 Web開發(fā)手冊 376
11.1 再談HTTP 376
11.2 設(shè)計RESTful API 377
11.2.1 資源的訪問操作 378
11.2.2 路由的設(shè)計 379
11.2.3 參數(shù) 379
11.2.4 參數(shù)檢驗(yàn) 382
11.2.5 響應(yīng)信息 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 響應(yīng)信息 396
11.5.1 正確時的響應(yīng)信息 397
11.5.2 錯誤時的響應(yīng)信息 399
11.5.3 小結(jié) 399
11.6 項(xiàng)目組織結(jié)構(gòu) 400
11.7 代碼管理和托管 402
11.8 Make構(gòu)建工具 403
11.8.1 語法規(guī)范 403
11.8.2 Go項(xiàng)目的命令 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 項(xiàng)目組織的形式 420
12.5 面向接口編程 421
12.6 自己實(shí)現(xiàn),學(xué)為己用 432
12.7 本章小結(jié) 441
第13章 Go學(xué)習(xí)路徑 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)控運(yùn)維 450