適讀人群 :Go語(yǔ)言初學(xué)者以及中級(jí)水平的開(kāi)發(fā)人員 Go語(yǔ)言正迅速成為構(gòu)建Web服務(wù)的優(yōu)選語(yǔ)言。盡管市面上有大量的教程向具有其他編程語(yǔ)言經(jīng)驗(yàn)的開(kāi)發(fā)者講授Go語(yǔ)法,但要熟練掌握Go語(yǔ)言,這些教程遠(yuǎn)遠(yuǎn)不夠,它們并沒(méi)有介紹Go語(yǔ)言的慣例模式與編程實(shí)踐。本書(shū)將指導(dǎo)讀者學(xué)習(xí)編寫(xiě)清晰且符合Go語(yǔ)言慣例的代碼所需的關(guān)鍵知識(shí)。
無(wú)論你的開(kāi)發(fā)經(jīng)驗(yàn)和水平如何,都將通過(guò)本書(shū)學(xué)會(huì)Go開(kāi)發(fā)者的思考模式。作者Jon Bodner精心介紹了經(jīng)驗(yàn)豐富的Go開(kāi)發(fā)者所采用的設(shè)計(jì)模式,并說(shuō)明了使用這些模式的理由。你還將提前了解Go即將發(fā)布的泛型特性,以及它是如何從設(shè)計(jì)到實(shí)現(xiàn),一步步融入Go語(yǔ)言的。
通過(guò)本書(shū),你將:
學(xué)習(xí)如何在Go語(yǔ)言中編寫(xiě)慣例代碼并設(shè)計(jì)Go項(xiàng)目。
理解Go語(yǔ)言設(shè)計(jì)中的權(quán)衡。
學(xué)會(huì)為獨(dú)立開(kāi)發(fā)人員或團(tuán)隊(duì)構(gòu)建Go語(yǔ)言的開(kāi)發(fā)環(huán)境。
了解如何以及何時(shí)使用反射、unsafe和cgo。
探究如何利用Go語(yǔ)言的特性使代碼高效運(yùn)行。
了解哪些Go語(yǔ)言的特性應(yīng)該少使用,或避免使用。
Go有小部分功能集與大多數(shù)其他現(xiàn)代編程語(yǔ)言格格不入。編寫(xiě)良好的Go程序往往簡(jiǎn)單明了,有時(shí)還有些重復(fù)。Go語(yǔ)言沒(méi)有繼承,沒(méi)有泛型(目前還沒(méi)有),沒(méi)有面向切面的編程(aspect-oriented programming),沒(méi)有函數(shù)重載,沒(méi)有操作符重載,沒(méi)有模式匹配,沒(méi)有命名參數(shù),沒(méi)有異常。讓很多人望而生畏的是,Go竟然有指針。Go的并發(fā)模型也與其他語(yǔ)言不同,但它基于20世紀(jì)70年代的思想,其垃圾收集器使用的算法也是如此。簡(jiǎn)言之,Go有些復(fù)古,而這正是關(guān)鍵所在。
不過(guò),無(wú)趣并不意味著平庸。要想正確使用Go,就需要了解它的功能是如何整合在一起的。即使你能夠?qū)懗隹雌饋?lái)像Java或Python的Go代碼,也并不會(huì)滿足于得到的結(jié)果,并且想弄清楚所有這些特性背后的底層機(jī)制是怎么回事。這正是本書(shū)的意義所在。本書(shū)清楚地介紹了Go的特性,解釋了如何才能最大限度地使用它們來(lái)編寫(xiě)可長(zhǎng)期維護(hù)且符合Go語(yǔ)言慣例的代碼。
在需要構(gòu)建某種可持續(xù)發(fā)展的事物時(shí),無(wú)趣是件好事。如果一座橋是用一項(xiàng)未經(jīng)測(cè)試的技術(shù)建造而成的,即使工程師認(rèn)為這項(xiàng)技術(shù)超級(jí)酷,也絕沒(méi)有人愿意成為第一個(gè)開(kāi)車通過(guò)的人。許多編程語(yǔ)言在添加特性時(shí)并沒(méi)有考慮它們對(duì)代碼庫(kù)可維護(hù)性的影響。Go的目標(biāo)正是讓開(kāi)發(fā)者能夠更容易、更高效地在幾十年的軟件生命周期中持續(xù)構(gòu)建規(guī);能浖。
Go語(yǔ)言確實(shí)很無(wú)趣,但是也很奇妙。希望本書(shū)能夠教會(huì)你如何用無(wú)趣的代碼構(gòu)建令人振奮的項(xiàng)目。
【目標(biāo)讀者】
本書(shū)的目標(biāo)讀者是想要學(xué)習(xí)Go語(yǔ)言的開(kāi)發(fā)者,尤其是Go語(yǔ)言的初學(xué)者。本書(shū)的重點(diǎn)不是簡(jiǎn)單地用Go寫(xiě)程序,而是寫(xiě)出符合Go語(yǔ)言慣例的程序。有經(jīng)驗(yàn)的Go開(kāi)發(fā)者可以在書(shū)中找到關(guān)于如何最有效地使用該語(yǔ)言的新特性的建議。最重要的是,讀者希望能夠?qū)W到如何寫(xiě)出像Go一樣的Go代碼。
讀者需要有開(kāi)發(fā)者行業(yè)工具的使用經(jīng)驗(yàn),比如版本控制(最好是Git)和IDE。讀者還應(yīng)該熟悉基本的計(jì)算機(jī)科學(xué)概念,如并發(fā)編程和抽象,因?yàn)闀?shū)中解釋了它們?nèi)绾卧贕o中工作。其中一些代碼示例可以從GitHub上下載,還有幾十個(gè)示例可以在The Go Playground上在線試用。雖然互聯(lián)網(wǎng)連接不是必需的,但它在回顧可執(zhí)行示例時(shí)很有幫助。由于Go經(jīng)常被用來(lái)構(gòu)建和調(diào)用HTTP服務(wù)端,所以有些示例需要讀者熟悉基本的HTTP概念。
雖然Go的大部分特性在其他語(yǔ)言中都能找到,但Go做出了不同的權(quán)衡,所以用它編寫(xiě)的程序具有不同的結(jié)構(gòu)。學(xué)習(xí)Go首先要從設(shè)置Go開(kāi)發(fā)環(huán)境開(kāi)始,然后涵蓋變量、類型、流程控制和功能。請(qǐng)不要跳過(guò)這些細(xì)節(jié),正是這些細(xì)節(jié)讓你的代碼符合Go的慣例。
【示例代碼】
可以從https://github.com/learning-go-book下載補(bǔ)充材料(示例代碼、練習(xí)、勘誤等)。
第1章 設(shè)置Go語(yǔ)言的開(kāi)發(fā)環(huán)境7
1.1 安裝Go工具7
1.2 Go的工作空間8
1.3 Go命令集9
1.4 分析與審查13
1.5 選擇開(kāi)發(fā)工具15
1.6 Makefile18
1.7 保持更新19
1.8 總結(jié)20
第2章 基礎(chǔ)類型和變量聲明21
2.1 內(nèi)置類型21
2.2 var與:= 30
2.3 const關(guān)鍵字32
2.4 有類型的常量與無(wú)類型的常量33
2.5 未使用的變量34
2.6 常量與變量的命名35
2.7 總結(jié)37
第3章 復(fù)合類型38
3.1 數(shù)組38
3.2 切片40
3.3 字符串、字符和字節(jié)49
3.4 映射52
3.5 結(jié)構(gòu)體57
3.6 總結(jié)61
第4章 代碼塊、影子變量和流程控制62
4.1 代碼塊62
4.2 if語(yǔ)句66
4.3 for語(yǔ)句67
4.4 switch語(yǔ)句78
4.5 默認(rèn)的switch語(yǔ)句81
4.6 if和switch之間的選擇82
4.7 goto語(yǔ)句83
4.8 總結(jié)85
第5章 函數(shù)86
5.1 函數(shù)的聲明和調(diào)用86
5.2 函數(shù)即值92
5.3 閉包95
5.4 defer98
5.5 函數(shù)的值調(diào)用101
5.6 總結(jié)103
第6章 指針104
6.1 指針快速入門(mén)104
6.2 不畏懼指針107
6.3 指針即可變的參數(shù)109
6.4 指針作為第二選擇113
6.5 指針傳遞可提高性能114
6.6 零值與無(wú)值114
6.7 映射與切片的區(qū)別115
6.8 切片用作緩沖區(qū)118
6.9 優(yōu)化垃圾回收119
6.10 總結(jié)121
第7章 類型、方法與接口122
7.1 Go語(yǔ)言的類型122
7.2 方法123
7.3 使用內(nèi)嵌進(jìn)行組合131
7.4 內(nèi)嵌不是繼承132
7.5 接口概覽133
7.6 接口是類型安全的鴨子類型134
7.7 內(nèi)嵌與接口137
7.8 接收接口,返回結(jié)構(gòu)體138
7.9 接口與nil139
7.10 空接口139
7.11 類型斷言與type-switch141
7.12 謹(jǐn)慎使用類型斷言與type-switch143
7.13 函數(shù)類型實(shí)現(xiàn)接口145
7.14 隱式接口實(shí)現(xiàn)依賴注入146
7.15 Wire150
7.16 Go并非傳統(tǒng)意義上的面向?qū)ο笳Z(yǔ)言150
7.17 總結(jié)150
第8章 錯(cuò)誤151
8.1 如何處理錯(cuò)誤151
8.2 使用字符串創(chuàng)建簡(jiǎn)單錯(cuò)誤152
8.3 哨兵錯(cuò)誤153
8.4 錯(cuò)誤是值155
8.5 包裝錯(cuò)誤157
8.6 Is和As159
8.7 使用defer包裝錯(cuò)誤162
8.8 panic和recover163
8.9 從錯(cuò)誤中獲取堆棧跟蹤信息165
8.10 總結(jié)165
第9章 模塊、包和導(dǎo)入166
9.1 倉(cāng)庫(kù)、模塊和包166
9.2 go.mod166
9.3 創(chuàng)建包167
9.4 模塊177
9.5 模塊的發(fā)布185
9.6模塊的版本控制186
9.7 模塊代理服務(wù)器187
9.8 總結(jié)188
第10章 Go的并發(fā)編程189
10.1 何時(shí)使用并發(fā)編程189
10.2 goroutine190
10.3 通道192
10.4 select語(yǔ)句194
10.5 并發(fā)實(shí)踐與模式197
10.6 何時(shí)使用互斥鎖211
10.7 atomic214
10.8 額外資源214
10.9 總結(jié)214
第11章 Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)215
11.1 標(biāo)準(zhǔn)io庫(kù)215
11.2 time220
11.3 encoding/json222
11.4 net/http228
11.5 總結(jié)234
第12章 上下文235
12.1 什么是上下文235
12.2 取消238
12.3 計(jì)時(shí)器241
12.4 在上下文中處理取消請(qǐng)求243
12.5 傳遞值244
12.6 總結(jié)249
第13章 測(cè)試250
13.1 測(cè)試的基本知識(shí)250
13.2 表格驅(qū)動(dòng)測(cè)試256
13.3 檢查代碼覆蓋率258
13.4 基準(zhǔn)測(cè)試261
13.5 Go中的測(cè)試樁264
13.6 httptest269
13.7 集成測(cè)試和編譯標(biāo)簽271
13.8 使用競(jìng)爭(zhēng)檢測(cè)器檢查并發(fā)問(wèn)題272
13.9總結(jié)274
第14章 惡龍禁區(qū):反射、unsafe和cgo275
14.1 在運(yùn)行時(shí)使用反射處理類型275
14.2 unsafe意味著不安全289
14.3 cgo用于集成,而不是為了性能294
14.4 總結(jié)297
第15章 展望未來(lái):Go中的泛型298
15.1 泛型減少冗余代碼,提高類型安全性298
15.2 Go中的泛型300
15.3 類型列表可指定操作符305
15.4 泛型函數(shù)抽象算法306
15.5 類型列表限制常量和實(shí)現(xiàn)307
15.6 暫不考慮的問(wèn)題310
15.7 慣例模式與泛型312
15.8 未來(lái)更多可能312
15.9 總結(jié)313