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