Go語言圣經(jīng)是由美國作者艾倫 A.A.多諾萬(Alan A.A.Donovan)和《C程序設(shè)計語言》的作者布萊恩 W.柯尼漢(Brian W.Kernighan)所編著的一本關(guān)于Go語言編程的權(quán)威著作。Go語言可以在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性,提高編程效率,適合開發(fā)大型軟件,有望成為主流的編程語言。
Go語言圣經(jīng)主要內(nèi)容
第一章包含了本教程的基本結(jié)構(gòu),通過十幾個程序介紹了用Go語言如何實現(xiàn)類似讀寫文件、文本格式化、創(chuàng)建圖像、網(wǎng)絡(luò)客戶端和服務(wù)器通訊等日常工作。
第二章描述了Go語言程序的基本元素結(jié)構(gòu)、變量、新類型定義、包和文件、以及作用域等概念。第三章討論了數(shù)字、布爾值、字符串和常量,并演示了如何顯示和處理Unicode字符。第四章描述了復(fù)合類型,從簡單的數(shù)組、字典、切片到動態(tài)列表。第五章涵蓋了函數(shù),并討論了錯誤處理、panic和recover,還有defer語句。
第一章到第五章是基礎(chǔ)部分,主流命令式編程語言這部分都類似。個別之處,Go語言有自己特色的語法和風(fēng)格,但是大多數(shù)程序員能很快適應(yīng)。其余章節(jié)是Go語言特有的:方法、接口、并發(fā)、包、測試和反射等語言特性。
Go語言的面向?qū)ο髾C(jī)制與一般語言不同。它沒有類層次結(jié)構(gòu),甚至可以說沒有類;僅僅通過組合(而不是繼承)簡單的對象來構(gòu)建復(fù)雜的對象。方法不僅可以定義在結(jié)構(gòu)體上, 而且, 可以定義在任何用戶自定義的類型上;并且, 具體類型和抽象類型(接口)之間的關(guān)系是隱式的,所以很多類型的設(shè)計者可能并不知道該類型到底實現(xiàn)了哪些接口。方法在第六章討論,接口在第七章討論。
第八章討論了基于順序通信進(jìn)程(CSP)概念的并發(fā)編程,使用goroutines和channels處理并發(fā)編程。第九章則討論了傳統(tǒng)的基于共享變量的并發(fā)編程。
第十章描述了包機(jī)制和包的組織結(jié)構(gòu)。這一章還展示了如何有效地利用Go自帶的工具,使用單個命令完成編譯、測試、基準(zhǔn)測試、代碼格式化、文檔以及其他諸多任務(wù)。
第十一章討論了單元測試,Go語言的工具和標(biāo)準(zhǔn)庫中集成了輕量級的測試功能,避免了強(qiáng)大但復(fù)雜的測試框架。測試庫提供了一些基本構(gòu)件,必要時可以用來構(gòu)建復(fù)雜的測試構(gòu)件。
第十二章討論了反射,一種程序在運(yùn)行期間審視自己的能力。反射是一個強(qiáng)大的編程工具,不過要謹(jǐn)慎地使用;這一章利用反射機(jī)制實現(xiàn)一些重要的Go語言庫函數(shù), 展示了反射的強(qiáng)大用法。第十三章解釋了底層編程的細(xì)節(jié),在必要時,可以使用unsafe包繞過Go語言安全的類型系統(tǒng)。
Go語言圣經(jīng)目錄
第1章綜述1
1.1Hello,World1
1.2命令行參數(shù)4
1.3查找重復(fù)行8
1.4GIF動畫13
1.5獲取一個URL15
1.6并發(fā)獲取多個URL17
1.7實現(xiàn)一個Web服務(wù)器19
1.8雜項23
第2章程序結(jié)構(gòu)27
2.1名字27
2.2聲明28
2.3變量30
2.4賦值36
2.5類型聲明39
2.6包和文件41
2.7作用域45
第3章基本數(shù)據(jù)類型51
3.1整數(shù)51
3.2浮點(diǎn)數(shù)56
3.3復(fù)數(shù)61
3.4布爾量63
3.5字符串64
3.6常量75
第4章復(fù)合類型81
4.1數(shù)組81
4.2切片84
4.3鍵值對93
4.4結(jié)構(gòu)體99
4.5JSON107
4.6文本和HTML模板113
第5章函數(shù)119
5.1函數(shù)聲明119
5.2遞歸121
5.3多返回值124
5.4錯誤127
5.5作為值的函數(shù)132
5.6匿名函數(shù)135
5.7變參函數(shù)142
5.8延后函數(shù)調(diào)用143
5.9崩潰148
5.10恢復(fù)151
第6章方法155
6.1方法聲明155
6.2帶有指針接收器的方法158
6.3包含嵌入結(jié)構(gòu)體的復(fù)合類型161
6.4作為值和表達(dá)式的方法164
6.5示例:位向量類型165
6.6封裝168
第7章接口171
7.1作為規(guī)約的接口171
7.2接口類型174
7.3接口約定的達(dá)成175
7.4使用flag.Value進(jìn)行標(biāo)志位分析179
7.5作為值的接口181
7.6使用sort.Interface進(jìn)行排序186
7.7http.Handler接口191
7.8錯誤接口196
7.9示例:表達(dá)式評估器197
7.10類型斷言205
7.11使用類型斷言分辨錯誤206
7.12使用接口類型斷言查詢行為208
7.13按類型的程序分支210
7.14示例:基于標(biāo)記符號的XML解碼213
7.15幾句建議216
第8章goroutine和信道217
8.1goroutine217
8.2示例:并發(fā)時鐘服務(wù)器219
8.3示例:并發(fā)回聲服務(wù)器222
8.4信道225
8.5并行循環(huán)234
8.6示例:并發(fā)Web爬蟲239
8.7使用select實現(xiàn)多工244
8.8示例:并發(fā)目錄遍歷247
8.9取消執(zhí)行251
8.10示例:聊天服務(wù)器253
第9章使用共享變量實現(xiàn)并發(fā)257
9.1競險257
9.2互斥量:sync.Mutex262
9.3讀寫互斥量:sync.RWMutex266
9.4內(nèi)存同步267
9.5緩式初始化:sync.Once268
9.6競險檢測器271
9.7示例:并發(fā)無阻塞式高速緩存272
9.8goroutine和線程280
第10章包和go工具283
10.1概述283
10.2導(dǎo)入路徑284
10.3包聲明285
10.4導(dǎo)入聲明285
10.5空導(dǎo)入286
10.6包和命名289
10.7go工具290
第11章測試301
11.1gotest工具302
11.2測試函數(shù)302
11.3覆蓋率318
11.4性能基準(zhǔn)函數(shù)321
11.5性能剖析323
11.6示例函數(shù)326
第12章反射329
12.1為什么會引入反射概念329
12.2reflect.Type和reflect.Value330
12.3遞歸值輸出Display333
12.4示例:對S-表達(dá)式編碼338
12.5使用reflect.Value給變量設(shè)置值341
12.6示例:對S-表達(dá)式解碼344
12.7訪問結(jié)構(gòu)體域標(biāo)簽348
12.8列出類型的方法351
12.9幾句忠告352
第13章低階程序設(shè)計353
13.1unsafe.Sizeof、Alignof和Offsetof354
13.2unsafe.Pointer356
13.3示例:深等價358
13.4使用cgo調(diào)用C代碼361
13.5再來幾句忠告366