Go語言從入門到進階實戰(視頻教學版)

Go語言從入門到進階實戰(視頻教學版)
定價:594
NT $ 517
  • 作者:徐波
  • 出版社:機械工業出版社
  • 出版日期:2018-06-01
  • 語言:簡體中文
  • ISBN10:7111598245
  • ISBN13:9787111598244
  • 裝訂:平裝 / 398頁 / 16k / 23.6 x 18.5 x 2 cm / 普通級 / 單色印刷 / 1-1
 

內容簡介

本書採用“理論+實例”的形式編寫,作者通過大量實例,並結合多年的一線開發實戰經驗,全面介紹了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
網路書店 類別 折扣 價格
  1. 新書
    87
    $517