本書(shū)全面介紹使用Go語(yǔ)言開(kāi)發(fā)Web應(yīng)用所需的全部基本概念,并詳細(xì)講解如何運(yùn)用現(xiàn)代設(shè)計(jì)原則使用Go語(yǔ)言構(gòu)建Web應(yīng)用。本書(shū)通過(guò)大量的實(shí)例介紹核心概念(如處理請(qǐng)求和發(fā)送響應(yīng)、模板引擎和數(shù)據(jù)持久化),并深入討論更多高級(jí)主題(如并發(fā)、Web應(yīng)用程序測(cè)試以及部署到標(biāo)準(zhǔn)系統(tǒng)服務(wù)器和PaaS提供商)。
本書(shū)以一個(gè)網(wǎng)絡(luò)論壇為例,講解如何使用請(qǐng)求處理器、多路復(fù)用器、模板引擎、存儲(chǔ)系統(tǒng)等核心組件構(gòu)建一個(gè)Go Web應(yīng)用,然后在這一應(yīng)用的基礎(chǔ)上,構(gòu)建出相應(yīng)的Web服務(wù)。值得一提的是,本書(shū)在介紹Go Web開(kāi)發(fā)方法時(shí),基本上只用到Go語(yǔ)言自帶的標(biāo)準(zhǔn)庫(kù),而不會(huì)用到任何特定的Web框架,讀者學(xué)到的知識(shí)將不會(huì)局限于特定的框架,即使將來(lái)需要用到現(xiàn)成的框架或者自行構(gòu)建框架,仍然會(huì)從本書(shū)中獲益。本書(shū)除了講解具體的Web開(kāi)發(fā)方法,還介紹如何對(duì)Go Web應(yīng)用進(jìn)行測(cè)試,如何使用Go的并發(fā)特性提高Web應(yīng)用的性能,以及如何在Heroku、Google App Engine、Digital Ocean等云平臺(tái)上部署Go Web應(yīng)用;此外,書(shū)中還傳授一些Go Web開(kāi)發(fā)方面的經(jīng)驗(yàn)和提示。這些重要的實(shí)踐知識(shí)將幫助讀者快速成為真正具有生產(chǎn)力的Go Web開(kāi)發(fā)者。
閱讀本書(shū)需要讀者具備基本的Go語(yǔ)言編程技能并掌握Go語(yǔ)言的語(yǔ)法。本書(shū)適合所有想用Go語(yǔ)言進(jìn)行Web開(kāi)發(fā)的讀者閱讀,無(wú)論是Web開(kāi)發(fā)的初學(xué)者還是入行已久的開(kāi)發(fā)者都會(huì)在閱讀本書(shū)的過(guò)程中有所收獲。
Go語(yǔ)言通過(guò)提供整潔快速的編譯代碼、垃圾回收、簡(jiǎn)單的并發(fā)Go模型以及豐富的標(biāo)準(zhǔn)庫(kù)來(lái)滿足人們對(duì)于可擴(kuò)展、高性能Web 應(yīng)用的需求,這種語(yǔ)言非常適用于編寫(xiě)微服務(wù),又或者用于構(gòu)建可擴(kuò)展且可維護(hù)的系統(tǒng)。
本書(shū)將教讀者運(yùn)用現(xiàn)代化設(shè)計(jì)理念構(gòu)建Go Web應(yīng)用的方法。閱讀本書(shū)能讓讀者學(xué)會(huì)如何通過(guò)依賴(lài)注入設(shè)計(jì)模式來(lái)編寫(xiě)測(cè)試替身,如何在Web應(yīng)用中使用并發(fā)特性,還有如何在Web服務(wù)中創(chuàng)建以及處理JSON數(shù)據(jù)和XML數(shù)據(jù)。除此之外,讀者還將學(xué)會(huì)如何盡可能地減少應(yīng)用對(duì)外部框架的依賴(lài),并了解大量與應(yīng)用測(cè)試以及應(yīng)用部署有關(guān)的有價(jià)值的生產(chǎn)技術(shù)。
本書(shū)主要內(nèi)容
● 基礎(chǔ)知識(shí)。
● 功能測(cè)試和基準(zhǔn)測(cè)試。
● 并發(fā)特性的使用方法。
● 將應(yīng)用部署到獨(dú)立服務(wù)器、PaaS云端以及 Docker 的方法。
● 大量提示、竅門(mén)以及技巧。
本書(shū)假設(shè)讀者熟悉Go語(yǔ)言的基本語(yǔ)法并了解Web 開(kāi)發(fā)的一般概念。
第一部分 Go與Web應(yīng)用
第1章 Go與Web應(yīng)用 3
1.1 使用Go語(yǔ)言構(gòu)建Web應(yīng)用 3
1.1.1 Go與可擴(kuò)展Web應(yīng)用 4
1.1.2 Go與模塊化Web應(yīng)用 4
1.1.3 Go與可維護(hù)的Web應(yīng)用 5
1.1.4 Go與高性能Web應(yīng)用 5
1.2 Web應(yīng)用的工作原理 6
1.3 HTTP簡(jiǎn)介 7
1.4 Web應(yīng)用的誕生 8
1.5 HTTP請(qǐng)求 9
1.5.1 請(qǐng)求方法 10
1.5.2 安全的請(qǐng)求方法 11
1.5.3 冪等的請(qǐng)求方法 11
1.5.4 瀏覽器對(duì)請(qǐng)求方法的支持 11
1.5.5 請(qǐng)求首部 12
1.6 HTTP響應(yīng) 13
1.6.1 響應(yīng)狀態(tài)碼 13
1.6.2 響應(yīng)首部 14
1.7 URI 15
1.8 HTTP/2簡(jiǎn)介 16
1.9 Web應(yīng)用的各個(gè)組成部分 16
1.9.1 處理器 17
1.9.2 模板引擎 18
1.10 Hello Go 18
1.11 小結(jié) 21
第2章 ChitChat論壇 23
2.1 ChitChat簡(jiǎn)介 23
2.2 應(yīng)用設(shè)計(jì) 24
2.3 數(shù)據(jù)模型 26
2.4 請(qǐng)求的接收與處理 27
2.4.1 多路復(fù)用器 27
2.4.2 服務(wù)靜態(tài)文件 29
2.4.3 創(chuàng)建處理器函數(shù) 29
2.4.4 使用cookie進(jìn)行訪問(wèn)控制 30
2.5 使用模板生成HTML響應(yīng) 33
2.6 安裝PostgreSQL 38
2.6.1 在Linux或FreeBSD系統(tǒng)上安裝 38
2.6.2 在Mac OS X系統(tǒng)上安裝 39
2.6.3 在Windows系統(tǒng)上安裝 39
2.7 連接數(shù)據(jù)庫(kù) 39
2.8 啟動(dòng)服務(wù)器 44
2.9 Web應(yīng)用運(yùn)作流程回顧 45
2.10 小結(jié) 46
第二部分 Web應(yīng)用的基本組成部分
第3章 接收請(qǐng)求 49
3.1 Go的net/http標(biāo)準(zhǔn)庫(kù) 49
3.2 使用Go構(gòu)建服務(wù)器 51
3.2.1 Go Web服務(wù)器 51
3.2.2 通過(guò)HTTPS提供服務(wù) 53
3.3 處理器和處理器函數(shù) 56
3.3.1 處理請(qǐng)求 56
3.3.2 使用多個(gè)處理器 58
3.3.3 處理器函數(shù) 59
3.3.4 串聯(lián)多個(gè)處理器和處理器函數(shù) 61
3.3.5 ServeMux和DefaultServeMux 65
3.3.6 使用其他多路復(fù)用器 66
3.4 使用HTTP/2 68
3.5 小結(jié) 70
第4章 處理請(qǐng)求 72
4.1 請(qǐng)求和響應(yīng) 72
4.1.1 Request結(jié)構(gòu) 73
4.1.2 請(qǐng)求URL 73
4.1.3 請(qǐng)求首部 74
4.1.4 請(qǐng)求主體 76
4.2 Go與HTML表單 77
4.2.1 Form字段 79
4.2.2 PostForm字段 80
4.2.3 MultipartForm字段 81
4.2.4 文件 83
4.2.5 處理帶有JSON主體的POST請(qǐng)求 85
4.3 ResponseWriter 86
4.4 cookie 91
4.4.1 Go與cookie 91
4.4.2 將cookie發(fā)送至瀏覽器 92
4.4.3 從瀏覽器里面獲取cookie 94
4.4.4 使用cookie實(shí)現(xiàn)閃現(xiàn)消息 96
4.5 小結(jié) 99
第5章 內(nèi)容展示 100
5.1 模板引擎 100
5.2 Go的模板引擎 102
5.2.1 對(duì)模板進(jìn)行語(yǔ)法分析 104
5.2.2 執(zhí)行模板 105
5.3 動(dòng)作 106
5.3.1 條件動(dòng)作 106
5.3.2 迭代動(dòng)作 108
5.3.3 設(shè)置動(dòng)作 109
5.3.4 包含動(dòng)作 111
5.4 參數(shù)、變量和管道 113
5.5 函數(shù) 114
5.6 上下文感知 116
5.6.1 防御XSS攻擊 119
5.6.2 不對(duì)HTML進(jìn)行轉(zhuǎn)義 121
5.7 嵌套模板 122
5.8 通過(guò)塊動(dòng)作定義默認(rèn)模板 126
5.9 小結(jié) 127
第6章 存儲(chǔ)數(shù)據(jù) 128
6.1 內(nèi)存存儲(chǔ) 128
6.2 文件存儲(chǔ) 131
6.2.1 讀取和寫(xiě)入CSV文件 133
6.2.2 gob包 135
6.3 Go與SQL 137
6.3.1 設(shè)置數(shù)據(jù)庫(kù) 138
6.3.2 連接數(shù)據(jù)庫(kù) 140
6.3.3 創(chuàng)建帖子 142
6.3.4 獲取帖子 144
6.3.5 更新帖子 145
6.3.6 刪除帖子 145
6.3.7 一次獲取多篇帖子 146
6.4 Go與SQL的關(guān)系 147
6.4.1 設(shè)置數(shù)據(jù)庫(kù) 147
6.4.2 一對(duì)多關(guān)系 150
6.5 Go與關(guān)系映射器 152
6.5.1 Sqlx 152
6.5.2 Gorm 154
6.6 小結(jié) 157
第三部分 實(shí)戰(zhàn)演練
第7章 Go Web服務(wù) 161
7.1 Web服務(wù)簡(jiǎn)介 161
7.2 基于SOAP的Web服務(wù)簡(jiǎn)介 163
7.3 基于REST的Web服務(wù)簡(jiǎn)介 166
7.3.1 將動(dòng)作轉(zhuǎn)換為資源 168
7.3.2 將動(dòng)作轉(zhuǎn)換為資源的屬性 169
7.4 通過(guò)Go分析和創(chuàng)建XML 169
7.4.1 分析XML 169
7.4.2 創(chuàng)建XML 177
7.5 通過(guò)Go分析和創(chuàng)建JSON 180
7.5.1 分析JSON 181
7.5.2 創(chuàng)建JSON 184
7.6 創(chuàng)建Go Web服務(wù) 187
7.7 小結(jié) 194
第8章 應(yīng)用測(cè)試 196
8.1 Go與測(cè)試 196
8.2 使用Go進(jìn)行單元測(cè)試 197
8.2.1 跳過(guò)測(cè)試用例 201
8.2.2 以并行方式運(yùn)行測(cè)試 202
8.2.3 基準(zhǔn)測(cè)試 203
8.3 使用Go進(jìn)行HTTP測(cè)試 206
8.4 測(cè)試替身以及依賴(lài)注入 210
8.5 第三方Go測(cè)試庫(kù) 217
8.5.1 Gocheck測(cè)試包簡(jiǎn)介 217
8.5.2 Ginkgo測(cè)試框架簡(jiǎn)介 223
8.6 小結(jié) 228
第9章 發(fā)揮Go的并發(fā)優(yōu)勢(shì) 230
9.1 并發(fā)與并行的區(qū)別 230
9.2 goroutine 232
9.2.1 使用goroutine 232
9.2.2 goroutine與性能 235
9.2.3 等待goroutine 238
9.3 通道 239
9.3.1 通過(guò)通道實(shí)現(xiàn)同步 240
9.3.2 通過(guò)通道實(shí)現(xiàn)消息傳遞 242
9.3.3 有緩沖通道 243
9.3.4 從多個(gè)通道中選擇 244
9.4 在Web應(yīng)用中使用并發(fā) 247
9.4.1 創(chuàng)建馬賽克圖片 248
9.4.2 馬賽克圖片Web應(yīng)用 251
9.4.3 并發(fā)版馬賽克圖片生成Web應(yīng)用 254
9.5 小結(jié) 262
第10章 Go的部署 263
10.1 將應(yīng)用部署到獨(dú)立的 服務(wù)器 264
10.2 將應(yīng)用部署到 Heroku 270
10.3 將應(yīng)用部署到Google App Engine 273
10.4 將應(yīng)用部署到 Docker 278
10.4.1 什么是Docker 278
10.4.2 安裝Docker 279
10.4.3 Docker的理念與 組件 280
10.4.4 Docker化一個(gè)Go Web 應(yīng)用 281
10.4.5 將Docker容器推送至 互聯(lián)網(wǎng) 283
10.5 部署方法之間的 對(duì)比 286
10.6 小結(jié) 287
附錄 安裝和設(shè)置Go 288