打開 Go 語言之門:入門、實戰與進階

飛雪無情 著

  • 出版商: 機械工業
  • 出版日期: 2022-11-01
  • 定價: $534
  • 售價: 8.5$454
  • 語言: 簡體中文
  • 頁數: 214
  • 裝訂: 平裝
  • ISBN: 7111712455
  • ISBN-13: 9787111712459
  • 相關分類: Go 程式語言
  • 立即出貨

買這商品的人也買了...

商品描述

通過不斷思考和整理,作者編寫了這本更具系統性也更通俗易懂的Go語言入門和進階書籍,
以幫助學習者少走彎路,比其他人更快一步提升職業競爭力。
本書共包含5個部分。
第1部分:快速入門Go語言。
作者挑選了變量、常量、基礎數據類型、函數和方法、結構體和接口等知識點進行介紹。
這部分內容相對簡潔,但已經足夠讓你掌握Go的基本程序結構了。
第2部分:Go語言的高效並發。
這部分主要介紹goroutine、channel、同步原語等知識,
讓你對Go語言層面的並發支持有更深入的理解,並且可以編寫自己的Go語言並發程序。
這個部分*後一章專門介紹常用的並發模式,可以拿來即用,以更好地控制並發。
第3部分:深入理解Go語言。
這部分講解Go 語言底層原理和高級功能,比如slice的底層是怎樣的、為什麼這麼高效等。
這部分內容也是作者特意設計的,跟著作者一起研究底層原理,可避免初學者不求甚解的通病。
總之,只有理解了底層原理,你才能更靈活地編寫程序並高效地應對問題。
第4部分:Go語言工程管理。
學習一門語言,不僅要掌握它本身的知識,還要掌握模塊管理、性能優化等周邊技能,
因為這些技能可以幫助你更好地進行多人協作,提高開發效率,寫出更高質量的代碼。
你可以在這部分學到如何測試Go語言代碼以提高代碼質量、
如何做好性能優化、如何使用第三方庫來提高自己項目的開發效率等。
第5部分:Go語言泛型。
這是Go語言在1.18版本中新增的特性,也是大家期待已久的特性。
在這一部分作者會帶你學習Go語言泛型的使用,以及如何使用泛型來提高效率和簡化代碼。

目錄大綱

前言學習Go語言,抓住未來的機遇
●第一部分快速入門Go語言
第1章基礎入門:Hello, Go語言 2
1.1 Hello,World 2
1.2 程序結構分析 3
1.3 搭建Go語言開發環境 4
1.3.1 在Windows下安裝 4
1.3.2 在Linux下安裝 4
1.3.3 在macOS下安裝 4
1.3.4 安裝測試 4
1.3.5 環境變量設置 5
1.4 項目結構 5
1.5 編譯發布 6
1.6 跨平台編譯 6
1.7 Go編輯器 7
1.8 小結 8
第2章數據類型:Go語言的基石 9
2.1 一個簡單示例 9
2.2 基礎類型 11
2.2.1 整型 11
2.2.2 浮點型 11
2.2.3 布爾型 12
2.2.4 字符串 12
2.2.5 零值 12
2.3 變量 13
2.3.1 變量簡短聲明 13
2.3.2 指針 13
2.3.3 賦值 13
2.4 常量 14
2.4.1 常量的定義 14
2.4.2 iota 14
2.5 字符串的使用 15
2.5.1 字符串和數字互轉 15
2.5.2 strings包 16
2.6 小結 16
第3章
控制結構:if、for、switch那些事兒 17
3.1 if條件語句 17
3.2 switch選擇語句 19
3.3 for循環語句 20
3.4 小結 22
第4章
集合類型:如何正確使用array、slice和map 23
4.1 數組 24
4.1.1 數組聲明 24
4.1.2 數組循環 25
4.2 切片 25
4.2.1 基於數組生成切片 26
4.2.2 切片的修改 26
4.2.3 切片的聲明 27
4.2.4 append函數 27
4.2.5 切片元素循環 28
4.3 映射 28
4.3.1 創建和初始化map 28
4.3.2 獲取和刪除map 29
4.3.3 遍歷map 29
4.3.4 獲取map的大小 30
4.4 string和[]byte 30
4.5 小結 31
第5章
函數和方法:如何區分函數和方法 32
5.1 函數 33
5.1.1 函數初探 33
5.1.2 函數聲明 33
5.1.3 多值返回 34
5.1.4 返回值命名 35
5.1.5 可變參數 36
5.1.6 包級函數 37
5.1.7 匿名函數和閉包 37
5.2 方法 39
5.2.1 不同於函數的方法 39
5.2.2 值和指針類型接收者 39
5.3 小結 40
第6章
struct和interface:隱式的接口實現 42
6.1 結構體 43
6.1.1 結構體的定義 43
6.1.2 聲明和使用 44
6.1.3 結構體的字段 44
6.2 接口 45
6.2.1 接口的定義 45
6.2.2 接口的實現 46
6.2.3 值和指針類型接收者 47
6.3 工廠函數 48
6.4 繼承和組合 49
6.5 類型斷言 50
6.6 小結 52
第7章
錯誤處理:如何更優雅地處理程序異常和錯誤 53
7.1 錯誤 54
7.1.1 error接口 54
7.1.2 error工廠函數 55
7.1.3 自定義error 55
7.1.4 error斷言 56
7.2 錯誤嵌套 56
7.2.1 Error Wrapping功能 56
7.2.2 errors.Unwrap函數 57
7.2.3 errors.Is函數 57
7.2.4 errors.As函數 58
7.3 defer函數 58
7.4 panic函數 59
7.5 recover函數 60
7.6 小結 60
●第二部分Go語言的高效並發
第8章
goroutine和channel:並發的基礎 62
8.1 什麼是並發 63
8.2 進程和線程 63
8.2.1 進程 63
8.2.2 線程 64
8.3 協程 64
8.4 管道 65
8.4.1 聲明一個管道 65
8.4.2 無緩衝管道 66
8.4.3 有緩衝管道 66
8.4.4 關閉管道 67
8.4.5 單向管道 67
8.5 select+channel示例 68
8.6 小結 69
第9章
同步原語:讓你對並發控制得心應手 70
9.1 資源競爭 70
9.2 同步原語 71
9.2.1 sync.Mutex 71
9.2.2 sync.RWMutex 72
9.2.3 sync.WaitGroup 73
9.2.4 sync.Once 75
9.2.5 sync.Cond 76
9.3 小結 77
第10章
Context:多協程並發控制神器 79
10.1 協程如何退出 79
10.2 Context的使用示例 81
10.3 Context詳解 82
10.4 Context樹 83
10.5 使用Context取消多個協程 84
10.6 Context傳值 85
10.7 Context使用原則 85
10.8 小結 86
第11章
並發模式:拿來即用的經驗總結 87
11.1 for select循環模式 87
11.2 select timeout模式 88
11.3 流水線模式 89
11.4 扇出和扇入模式 92
11.5 Future模式 94
11.6 小結 96
第12章
並發技巧:高效並發安全的字節池 97
12.1 字節切片 97
12.2 高效字節池 98
12.3 使用BytePoolCap 99
12.4
BytePoolCap與sync.Pool的
對比 99
12.5 小結 101
●第三部分深入理解Go語言
第13章
指針詳解:什麼情況下應該使用指針 104
13.1 什麼是指針 104
13.2 指針的聲明和定義 105
13.3 指針的操作 107
13.4 指針參數 107
13.5 指針接收者 108
13.6 什麼情況下使用指針 108
13.7 小結 109
第14章
參數傳遞:值、引用以及指針的區別 110
14.1 修改參數 111
14.2 值類型 112
14.3 指針類型 113
14.4 引用類型 114
 14.4.1 map 114
 14.4.2 chan 116
14.5 類型的零值 116
14.6 小結 117
第15章
內存分配:new和make該如何選擇 118
15.1 變量 118
 15.1.1 變量的聲明 119
 15.1.2 變量的賦值 119
15.2 new函數 120
15.3 變量初始化 121
 15.3.1 指針變量初始化 122
 15.3.2 make 函數 123
15.4 小結 124
第16章
運行時反射:字符串和結構體之間如何轉換 125
16.1 什麼是反射 125
16.2 獲取對象的值和類型 126
16.3 ref lect.Value 126
 16.3.1 結構體定義 126
 16.3.2 獲取原始類型 128
 16.3.3 修改對應的值 128
 16.3.4 獲取對應的底層類型 129
16.4 ref lect.Type 130
 16.4.1 接口定義 130
 16.4.2 遍歷結構體的字段和方法 131
 16.4.3 是否實現某接口 132
16.5 字符串和結構體的互轉 133
 16.5.1 JSON和struct互轉 133
 16.5.2 struct tag功能 134
 16.5.3 struct轉JSON的示例 135
16.6 反射定律 136
16.7 小結 137
第17章
非類型安全:不安全但高效的unsafe 138
17.1 指針類型轉換 139
17.2 unsafe.Pointer 139
17.3 uintptr 指針類型 140
17.4 指針轉換規則 142
17.5 unsafe.Sizeof 142
17.6 小結 143
第18章
零拷貝:slice為何如此高效 144
18.1 數組 144
18.2 slice 145
 18.2.1 動態擴容 145
 18.2.2 數據結構 146
 18.2.3 高效的原因 148
 18.2.4 string 和[]byte 互轉 149
18.3 小結 151
第19章
實戰:字符串如何高效拼接 152
19.1 一個例子 152
19.2 幾種拼接方式 153
 19.2.1 “+”拼接 153
 19.2.2 fmt 拼接 153
 19.2.3 join 拼接 154
 19.2.4 buffer 拼接 154
 19.2.5 builder拼接 155
19.3 性能對比 155
19.4 拼接函數改造 156
19.5 再次進行性能測試 157
 19.5.1 10個字符串 157
 19.5.2 100個字符串 160
 19.5.3 1000個字符串 161
19.6 builder拼接慢在哪裡 161
19.7 內存分配優化 162
19.8 小結 163
●第四部分Go語言工程管理
第20章測試:質量保證的基石 166
20.1 單元測試 166
 20.1.1 什麼是單元測試 166
 20.1.2 Go 語言的單元測試 167
 20.1.3 單元測試覆蓋率 169
20.2 基準測試 170
 20.2.1 什麼是基準測試 170
 20.2.2 Go 語言的基準測試 170
 20.2.3 計時方法 171
 20.2.4 內存統計 172
 20.2.5 並發基準測試 172
 20.2.6 基準測試實戰 173
20.3 小結 174
第21章
性能優化:如何寫出高質量的代碼 175
21.1 代碼規範檢查 175
 21.1.1 什麼是代碼規範檢查 175
 21.1.2 golangci-lint的安裝和使用 176
 21.1.3 golangci-lint的配置 177
 21.1.4 集成golangci-lint 到CI 179
21.2 性能優化 179
 21.2.1 堆或棧分配 179
 21.2.2 逃逸分析 180
 21.2.3 優化技巧 182
21.3 小結 183
第22章
協作開發:模塊化管理 184
22.1 Go語言中的包 184
 22.1.1 什麼是包 184
 22.1.2 使用包 185
 22.1.3 作用域 185
 22.1.4 自定義包 185
 22.1.5 init 函數 186
22.2 Go 語言中的模塊 186
 22.2.1 go mod 186
 22.2.2 使用第三方模塊 187
22.3 小結 188
●第五部分Go語言泛型
第23章
初識泛型:使用泛型簡化編程 192
23.1 一個非泛型示例 192
23.2 使用泛型重構示例 193
23.3 類型推導 194
23.4 自定義類型約束 194
23.5 內置的類型約束 195
 23.5.1 Signed 196
 23.5.2 Unsigned 196
 23.5.3 Integer 196
 23.5.4 Float 196
 23.5.5 Ordered 196
23.6 函數式編程 197
 23.6.1 map 197
 23.6.2 reduce 199
 23.6.3 f ilter 200
23.7 小結 201
第24章
深入泛型:漫談泛型設計 202
24.1 為什麼需要泛型 202
24.2 類型參數 203
24.3 泛型類型 204
24.4 類型約束 205
 24.4.1 any約束 206
 24.4.2 類型集 206
24.5 再論類型推導 209
 24.5.1 參數類型推導 209
 24.5.2 約束類型推導 210
24.6 小結 211
結束語你的Go語言成長之路 212