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