買這商品的人也買了...
-
$620$527 -
$450$356 -
$480$408 -
$780$616 -
$403Laravel 框架關鍵技術解析
-
$356Go 語言實戰 (GO in Action)
-
$450$356 -
$560$437 -
$450$356 -
$403Go Web 編程 (Go Web Programming)
-
$580$452 -
$210$200 -
$301分佈式對象存儲 : 原理、架構及 Go語言實現
-
$301Go語言入門經典
-
$680$537 -
$352Elasticsearch 搜索引擎開發實戰
-
$690$538 -
$450$338 -
$480$379 -
$403Go語言編程入門與實戰技巧
-
$454跟著項目學 iOS 應用開發:基於 Swift 4
-
$250分佈式緩存 原理、架構及 Go 語言實現
-
$380$296 -
$800$600 -
$454Go 語言高級編程
相關主題
商品描述
本書採用“理論+實例”的形式編寫,作者通過大量實例,並結合多年的一線開發實戰經驗,全面介紹了Go語言的語法及應用開發。作者特意為本書精心錄制了同步配套教學視頻,這將極大地提升讀者的學習效率。本書分為13章,主要介紹了Go語言的特性與環境搭建、基本語法與使用、容器(存儲和組織數據的方式)、流程控制、函數、結構體、接口(interface)、包(package)、並發、反射、編譯與工具和開發技巧等內容,後的實戰演練部分剖析了作者的開源網絡庫cellnet的架構及設計思想,並且實現了Socket聊天功能。本書對於Go語言的特色功能——並發,有全面、深入的講解,需要讀者重點學習。本書特別適合Go語言初學者入門和進階閱讀,另外也適合社會培訓學校作為教材使用,還適合大中專院校的相關專業作為教學參考書。
作者簡介
徐波
資深全棧遊戲開發者,慕課網特邀講師,開源愛好者,Gopher之一。遊戲行業從業十餘年。
曾就職於著名的網絡遊戲公司Possibility Space,
與暴雪星際爭霸程序Gage Galinge和美術界知名原畫師朱峰(變形金剛電影版紅蜘蛛設計者)一起開發了大型3D暗黑系魔幻網游Warrior Epic。
業界最早實現了微端Download On Demand技術。2009年開設戰魂小築博客。2012年開始使用Go語言,並在GitHub上發布了cellnet網絡庫及tabtoy導表工具,深受業界讚譽。
作為慕課網特邀講師,製作了多個技術視頻,講授Go語言、Cocos和Unity等課程,廣受學員好評。
目錄大綱
前言
第1章初識Go語言1
1.1 Go語言特性1
1.2使用Go語言的項目9
1.3怎樣安裝Go語言開發包10
1.3.1 Windows版安裝11
1.3.2 Linux版安裝13
1.4搭建開發環境14
1.4.1集成開發環境——Jetbrains GoLand14
1.4.2方便定義功能的編輯器——Visual Studio Code15
第2章Go語言基本語法與使用19
2.1變量19
2.1.1聲明變量19
2.1.2初始化變量20
2.1.3多個變量同時賦值23
2.1.4匿名變量——沒有名字的變量24
2.2數據類型24
2.2.1整型25
2.2.2浮點型25
2.2.3示例:輸出正弦函數(Sin)圖像26
2.2.4布爾型28
2.2.5字符串29
2.2.6字符31
2.2.7切片——能動態分配的空間32
2.3轉換不同的數據類型33
2.4指針34
2.4.1認識指針地址和指針類型35
2.4.2從指針獲取指針指向的值36
2.4.3使用指針修改值37
2.4.4示例:使用指針變量獲取命令行的輸入信息39
2.4.5創建指針的另一種方法——new()函數40
2.5變量生命期——變量能夠使用的代碼範圍40
2.5.1什麼是棧41
2.5.2什麼是堆42
2.5.3變量逃逸(Escape Analysis)——自動決定變量分配方式,提高運行效率43
2.6字符串應用46
2.6.1計算字符串長度46
2.6.2遍歷字符串——獲取每一個字符串元素47
2.6.3獲取字符串的某一段字符48
2.6.4修改字符串49
2.6.5連接字符串49
2.6.6格式化50
2.6.7示例:Base64編碼——電子郵件的基礎編碼格式51
2.6.8示例:從INI配置文件中查詢需要的值52
2.7常量——恆定不變的值57
2.7.1枚舉——一組常量值58
2.7.2將枚舉值轉換為字符串59
2.8類型別名(Type Alias)60
2.8.1區分類型別名與類型定義61
2.8.2非本地類型不能定義方法62
2.8.3在結構體成員嵌入時使用別名63
第3章容器:存儲 和組織數據的方式65
3.1數組——固定大小的連續空間65
3.1.1聲明數組66
3.1.2初始化數組66
3.1.3遍歷數組——訪問每一個數組元素67
3.2切片(slice)——動態分配大小的連續空間67
3.2.1從數組或切片生成新的切片68
3.2.2聲明切片70
3.2.3使用make()函數構造切片71
3.2.4使用append()函數為切片添加元素71
3.2.5複製切片元素到另一個切片73
3.2.6從切片中刪除元素74
3.3映射(map)——建立事物關聯的容器76
3.3.1添加關聯到map並訪問關聯和數據76
3.3.2遍歷map的“鍵值對”——?訪問每一個map中的關聯關係77
3.3.3使用delete()函數從map中刪除鍵值對79
3.3.4清空map中的所有元素79
3.3.5能夠在並發環境中使用的map——?sync.Map79
3.4列表(list)——可以快速增刪的非連續空間的容器81
3.4.1初始化列表83
3.4.2在列表中插入元素83
3.4.3從列表中刪除元素84
3.4.4遍歷列表——訪問列表的每一個元素85
第4章流程控制87
4.1條件判斷(if)87
4. 2構建循環(for)88
4.2.1 for中的初始語句——開始循環時執行的語句89
4.2.2 for中的條件表達式——控制是否循環的開關89
4.2.3 for中的結束語句——每次循環結束時執行的語句90
4.3示例:九九乘法表90
4.4鍵值循環(for range)——直接獲得對象的索引和數據91
4.4.1遍歷數組、切片——獲得索引和元素92
4.4.2遍歷字符串— —獲得字符92
4.4.3遍歷map——獲得map的鍵和值92
4.4.4遍歷通道(channel)——接收通道數據93
4.4.5在遍歷中選擇希望獲得的變量93
4.5分支選擇(switch) ——擁有多個條件分支的判斷94
4.5.1基本寫法95
4.5.2跨越case的fallthrough——兼容C語言的case設計96
4.6跳轉到指定代碼標籤(goto)96
4.6.1使用goto退出多層循環96
4.6.2使用goto集中處理錯誤97
4.6.3統一錯誤處理98
4.7跳出指定循環(break)——可以跳出多層循環99
4.8繼續下一次循環(continue)100
第5章函數(function) 101
5.1聲明函數101
5.1.1普通函數的聲明形式101
5.1.2參數類型的簡寫102
5.1.3函數的返回值102
5.1.4調用函數104
5.1.5示例:將“秒”解析為時間單位104
5.1.6示例:函數中的參數傳遞效果測試105
5.2函數變量——把函數作為值保存到變量中108
5.3示例:字符串的鍊式處理——操作與數據分離的設計技巧109
5.4匿名函數——沒有函數名字的函數112
5.4.1定義一個匿名函數112
5.4.2匿名函數用作回調函數113
5.4.3使用匿名函數實現操作封裝113
5.5函數類型實現接口——把函數作為接口來調用115
5.5.1結構體實現接口115
5.5.2函數體實現接口116
5.6閉包(Closure)——引用了外部變量的匿名函數118
5.6.1在閉包內部修改引用的變量119
5.6.2示例:閉包的記憶效應119
5.6.3示例:閉包實現生成器121
5.7可變參數——參數數量不固定的函數形式122
5.7.1 fmt包中的例子122
5.7.2遍歷可變參數列表——獲取每一個參數的值123
5.7.3獲得可變參數類型—— 獲得每一個參數的類型124
5.7.4在多個可變參數函數中傳遞參數125
5.8延遲執行語句(defer)127
5.8.1多個延遲執行語句的處理順序127
5.8.2使用延遲執行語句在函數退出時釋放資源127
5.9處理運行時發生的錯誤131
5.9.1 net包中的例子131
5.9.2錯誤接口的定義格式132
5.9.3自定義一個錯誤132
5.9.4示例:在解析中使用自定義錯誤133
5.10宕機(panic)——程序終止運行135
5.10.1手動觸發宕機135
5.10.2在運行依賴的必備資源缺失時主動觸發宕機136
5.10.3在宕機時觸發延遲執行語句136
5.11宕機恢復(recover)——防止程序崩潰137
5.11.1讓程序在崩潰時繼續執行137
5.11.2 panic和recover的關係139
第6章結構體(struct)141
6.1定義結構體141
6.2實例化結構體——為結構體分配內存並初始化142
6.2.1基本的實例化形式142
6.2.2創建指針類型的結構體143
6.2.3取結構體的地址實例化143
6.3初始化結構體的成員變量144
6.3.1使用“鍵值對”初始化結構體145
6.3.2使用多個值的列表初始化結 體146
6.3.3初始化匿名結構體147
6.4構造函數——結構體和類型的一系列初始化操作的函數封裝148
6.4.1多種方式創建和初始化結構體——模擬構造函數重載149
6.4.2帶有父子關係的結構體的構造和初始化——模擬父級構造調用149
6.5方法150
6.5.1為結構體添加方法151
6.5.2接收器——方法作用的目標152
6.5.3示例:二維矢量模擬玩家移動155
6.5.4為類型添加方法160
6.5.5示例:使用事件系統實現事件的響應和處理165
6.6類型內嵌和結構體內嵌170
6.6.1聲明結構體內嵌170
6.6.2結構內嵌特性172
6.6.3使用組合思想描述對象特性173
6.6.4初始化結構體內嵌174
6.6.5初始化內嵌匿名結構體175
6.6.6成員名字衝突177
6.7示例:使用匿名結構體分離JSON數據178
第7章接口(interface)181
7.1聲明接口181
7.1.1接口聲明的格式181
7.1.2開發中常見的接口及寫法182
7.2實現接口的條件182
7.2.1接口被實現的條件一:接口的方 與實現接口的類型方法格式一致182
7.2.2條件二:接口中所有方法均被實現185
7.3理解類型與接口的關係186
7.3.1一個類型可以實現多個接口186
7.3.2多個類型可以實現相同的接口187
7.4示例:便於擴展輸出方式的日誌系統189
7.5示例:使用接口進行數據的排序195
7.5.1使用sort.Interface接口進行排序195
7.5.2常見類型的便捷排序197
7.5.3對結構體數據進行排序199
7.6接口的嵌套組合——將多個接口放在一個接口內202
7.7在接口和類型間轉換205
7.7.1類型斷言的格式205
7.7.2將接口轉換為其他接口205
7.7.3將接口轉換為其他類型208
7.8空接口類型(interface{})——能保存所有值的類型208
7.8.1將值保存到空接口209
7.8.2從空接口獲取值209
7.8.3空接口的值比較210
7.9示例:使用空接口實現可以保存任意值的字典211
7.10類型分支— —批量判斷空接口中變量的類型214
7.10.1類型斷言的書寫格式214
7.10.2使用類型分支判斷基本類型215
7.10.3使用類型分支判斷 接口類型215
7.11示例:實現有限狀態機(FSM)217
第8章包(package)227
8.1工作目錄(GOPATH)227
8.1.1使用命令行查看GOPATH信息227
8.1.2使用GOPATH的工程結構228
8.1.3設置和使用GOPATH229
8.1.4在多項目工程中使用GOPATH230
8.2創建包package——編寫自己的代碼擴展231
8.3導出標識符——讓外部訪問包的類型和值231
8.3.1導出包內標識符231
8.3.2導出結構體及接口成員232
8.4導入包(import)——在代碼中使用其他的代碼232
8.4.1默認導入的寫法233
8.4.2導入包後自定義引用的包名234
8.4.3匿名導入包——只導入包但不使用包內類型和數值235
8.4.4包在程序啟動前的初始化入口:init235
8.4.5理解包導入後的init()函數初始化順序235
8.5示例:工廠模式自動註冊——管理多個包的結構體237
第9章並發241
9.1輕量級線程(goroutine)——根據需要隨時創建的“線程”241
9.1.1使用普通函數創建goroutine241
9.1.2使用匿名函數創建goroutine244
9.1.3調整併發的運行性 能(GOMAXPROCS)245
9.1.4理解並發和並行245
9.1.5 Go語言的協作程序(goroutine)和普通的協作程序(coroutine)246
9.2通道(channel)——在多個goroutine間通信的管道246
9.2.1通道的特性247
9.2.2聲明通道類型247
9.2.3創建通道248
9.2.4使用通道發送數據248
9.2.5使用通道接收數據249
9.2.6示例:並發打印252
9.2.7單向通道——通道中的單行道254
9.2.8帶緩衝的通道255
9.2.9通道的多路復用——同時處理接收和發送多個通道的數據257
9.2.10示例:模擬遠程過程調用(RPC)258
9.2.11示例:使用通道響應計時器的事件261
9.2.12關閉通道後繼續使用通道264
9.3示例:Telnet回音服務器——TCP服務器的基本結構266
9.4同步——保證並發環境下數據訪問的正確性273
9.4.1競態檢測——檢測代碼在並發環境下可能出現的問題273
9.4.2互斥鎖(sync.Mutex)——保證同時只有一個goroutine可以訪問共享資源275
9.4.3讀寫互斥鎖(sync.RWMutex)— —在讀比寫多的環境下比互斥鎖更高效277
9.4.4等待組(sync.WaitGroup)——保證在並發環境中完成指定數量的任務277
第10章反射280
10.1反射的類型對象(reflect.Type)280
10.1.1理解反射的類型(Type)與種類(Kind)281
10.1.2指針與指針指向的元素283
10.1.3使用反射獲取結構體的成員類型284
10.1.4結構體標籤(Struct Tag)——對結構體字段的額外信息標籤287
10.2反射的值對象(reflect.Value)288
10.2.1使用反射值對象包裝任意值288
10.2.2從反射值對象獲取被包裝的值289
10.2.3使用反射訪問結構體的成員字段的值290
10.2.4反射對象的空和有效性判斷292
10.2.5使用反射值對象修改變量的值293
10.2. 6通過類型創建類型的實例297
10.2.7使用反射調用函數298
10.3示例:將結構體的數據保存為JSON格式的文本數據299
第11章編譯與工具306
11.1編譯(go build)306
11.1.1 go build無參數編譯306
11.1.2 go build+文件列表307
11.1.3 go build +包308
11.1. 4 go build編譯時的附加參數310
11.2編譯後運行(go run)310
11.3編譯並安裝(go install)311
11.4一鍵獲取代碼、編譯並安裝(go get)312
11.4.1遠程包的路徑格式312
11.4.2 go get +遠程包312
11.4.3 go get使用時的附加參數313
11.5測試(go test)313
11.5.1單元測試——測試和驗證代碼的框架313
11.5.2基準測試——獲得代碼內存佔用和運行效率的性能數據316
11.6性能分析(go pprof)——發現代碼性能問題的調用位置319
11.6.1安裝第三方圖形化顯式分析數據工具(Graphviz)319
11.6.2安裝第三方性能分析來分析代碼包319
11.6.3性能分析代碼319
第12章“避坑”與技巧323
12.1合理地使用並發特性323
12.1.1了解goroutine的生命期時再創建goroutine323
12.1.2避免在不必要的地方使用通道326
12.2反射:性能和靈活性的雙刃劍330
12.3接口的nil判斷335
12.4 map的多鍵索引——多個數值條件可以同時查詢336
12.4.1基於哈希值的多鍵索引及查詢337
12.4.2利用map特 性的多鍵索引及查詢341
12.4.3總結342
12.5優雅地處理TCP粘包342
第13章實戰演練——剖析cellnet網絡庫設計並實現Socket聊天功能354
13.1了解cellet網絡庫特性、流程及架構354
13.1.1 cellnet網絡庫的特性354
13.1.2 cellnet網絡庫的流程及架構356
13.2管理TCP Socket連接356
13.2.1理解Socket的事件類型357
13.2.2管理事件回調359
13.2.3連接器(Connector)361
13.2.4會話管理(SessionManager)363
13.2.5接受器(Acceptor)366
13.3組織接收和發送數據流程的Socket會話(Session)367
13.3.1在會話開始時啟動goroutine和派發事件368
13.3.2會話中的接收數據循環369
13.3.3會話中的發送數據循環370
13.4排隊處理事件的事件隊列(EventQueue)372
13.4.1實現事件隊列372
13.4.2使用不同的事件隊列模式處理數據374
13.5消息編碼(codec)——讓cellnet支持消息的多種編碼格式377
13.6消息元信息(MessageMeta)——消息ID、消息名稱和消息類型的關聯關係379
13. 6.1理解消息元信息380
13.6.2註冊消息元信息380
13.6.3示例:使用消息元信息381
13.6.4實現消息的編碼(EncodeMessage())和解碼(DecodeMessage())函數382
13.7接收和發送封包(packet)383
13.7. 1接收可變長度封包384
13.7.2了解封包數據讀取器(PacketReader)385
13.7.3了解封包數據寫入器(PacketWriter)387
13.7.4讀取自定義封包及數據387
13.7.5寫入自定義封包及數據389
13.7.6響應消息處理事件390
13.8使用cellnet網絡庫實現聊天功能392
13.8.1定義聊天協議393
13.8.2實現客戶端功能394
13.8.3實現服務器功能396
13.8.4運行聊天服務器和客戶端398