深入理解 Go 語言

劉丹冰

  • 出版商: 清華大學
  • 出版日期: 2023-04-01
  • 售價: $714
  • 貴賓價: 9.5$678
  • 語言: 簡體中文
  • 頁數: 452
  • 裝訂: 平裝
  • ISBN: 7302613664
  • ISBN-13: 9787302613664
  • 相關分類: Go 程式語言程式語言
  • 立即出貨

  • 深入理解 Go 語言-preview-1
  • 深入理解 Go 語言-preview-2
  • 深入理解 Go 語言-preview-3
深入理解 Go 語言-preview-1

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

商品描述

本書為深入理解學習Go語言必經之路中的重點知識領域,採用大量精美詳細的圖文介紹,文章講解深入淺出,極大降低了理解Golang底層精髓的學習門檻。 本書包含3篇:第一篇為深度理論篇(第1章~第4章),包含深入理解Golang中GPM模型、深入理解Golang垃圾回收GC三色標記與混合寫屏障、深入理解Golang內存管理模型、網絡IO復用模型等。第二篇為Golang實戰中需要進階的知識盲區介紹(第5章~第12章)。第三篇為基於Golang從0到1的實現輕量級網絡服務框架Zinx及相關應用案例。 本書主要的面向讀者是已經具有軟件編程開發經驗的工程師、系統開發工程師、期望由Python、PHP、C/C++、Ruby、Java等編程語言轉職到Golang開發的後端工程師、期望深入理解Go語言特性的電腦軟件學者等。

目錄大綱

 

 

 

 

目錄

第一篇Go語言修煉必經之路

 

 

第1章深入理解Go語言協程調度器GPM模型

 

1.1Go語言“調度器”的由來

 

1.1.1單進程時代不需要調度器

 

1.1.2多進程/多線程時代的調度器需求

 

1.1.3協程提高CPU的利用率

 

1.1.4Go語言的協程Goroutine

 

1.1.5被廢棄的Goroutine調度器

 

1.2Go語言調度器GPM模型的設計思想

 

1.2.1GPM模型

 

1.2.2調度器的設計策略

 

1.2.3go func() 調度流程

 

1.2.4調度器的生命周期

 

1.2.5可視化GPM編程

 

1.3Go調度器調度場景過程全解析

 

1.3.1場景1: G1創建G2

 

1.3.2場景2: G1執行完畢

 

1.3.3場景3: G2開闢過多的G

 

1.3.4場景4: G2本地滿再創建G7

 

1.3.5場景5: G2本地未滿再創建G8

 

1.3.6場景6: 喚醒正在休眠的M

 

1.3.7場景7: 被喚醒的M2從全局隊列批量取G

 

1.3.8場景8: M2從M1中偷取

 

1.3.9場景9: 自旋線程的最大限制

 

1.3.10場景10: G發生阻塞的系統調用

 

1.3.11場景11: G發生非阻塞的系統調用

 

1.4小結

 

第2章Go語言混合寫屏障的GC全場景分析

 

2.1Go V1.3標記清除算法

 

2.1.1標記清除(Mark and Sweep)算法的詳細過程

 

2.1.2標記清除算法的缺點

 

2.2Go V1.5的三色標記法

 

2.2.1三色標記法的過程

 

2.2.2沒有STW的三色標記法

 

2.2.3觸發三色標記法不安全的必要條件

 

2.3Go V1.5 的屏障機制

 

2.3.1“強弱”三色不變式

 

2.3.2插入屏障

 

2.3.3刪除屏障

 

2.4Go V1.8的混合寫屏障

 

2.4.1混合寫屏障(Hybrid Write Barrier)規則

 

2.4.2場景1: 堆刪除引用,成為棧下游

 

2.4.3場景2: 棧刪除引用,成為棧下游

 

2.4.4場景3: 堆刪除引用,成為堆下游

 

2.4.5場景4: 棧刪除引用,成為堆下游

 

2.5小結

 

第3章Go語言內存管理洗髓經

 

3.1何為內存

 

3.2內存為什麽需要管理

 

3.3操作系統是如何管理內存的

 

3.3.1虛擬內存

 

3.3.2MMU內存管理單元

 

3.3.3虛擬內存本身怎麽存放

 

3.3.4CPU內存訪問過程

 

3.3.5內存的局部性

 

3.4如何用Go語言實現內存管理和內存池設計

 

3.4.1基於Cgo的內存C接口封裝

 

3.4.2基礎內存緩沖Buf實現

 

3.4.3內存池設計與實現

 

3.4.4內存池的功能單元測試

 

3.4.5內存管理應用接口

 

3.5Go語言內存管理之魂TCMalloc

 

3.5.1TCMalloc

 

3.5.2TCMalloc模型相關基礎結構

 

3.5.3ThreadCache

 

3.5.4CentralCache

 

3.5.5PageHeap

 

3.5.6TCMalloc的小對象分配

 

3.5.7TCMalloc的中對象分配

 

3.5.8TCMalloc的大對象分配

 

3.6Go語言堆內存管理

 

3.6.1Go語言內存模型層級結構

 

3.6.2Go語言內存管理單元相關概念

 

3.6.3MCache

 

3.6.4MCentral

 

3.6.5MHeap

 

3.6.6Tiny對象分配流程

 

3.6.7小對象分配流程

 

3.6.8大對象分配流程

 

3.7小結

 

第4章深入理解Linux網絡I/O復用並發模型

 

4.1網絡並發模型中的幾個基本概念

 

4.1.1流

 

4.1.2I/O操作

 

4.1.3阻塞等待

 

4.1.4非阻塞忙輪詢

 

4.1.5阻塞與非阻塞對比

 

4.2解決阻塞等待缺點的辦法

 

4.2.1阻塞死等待的缺點

 

4.2.2解決阻塞等待的辦法1: 多線程/多進程

 

4.2.3解決阻塞等待的辦法2: 非阻塞忙輪詢

 

4.2.4解決阻塞等待的辦法3: select

 

4.2.5解決阻塞等待的辦法4: epoll

 

4.3什麽是epoll

 

4.4epoll的觸發模式

 

4.4.1水平觸發

 

4.4.2邊緣觸發

 

4.5簡單的epoll服務器

 

4.5.1服務器端實現

 

4.5.2客戶端實現

 

4.6Linux下常見的網絡I/O復用並發模型

 

4.6.1模型1: 單線程Accept(無I/O復用)

 

4.6.2模型2: 單線程Accept+多線程讀寫業務(無I/O復用)

 

4.6.3模型3: 單線程多路I/O復用

 

4.6.4模型4: 單線程多路I/O復用+多線程讀寫業務(業務工作池)

 

4.6.5模型5: 單線程I/O復用+多線程I/O復用(連接線程池)

 

4.6.6模型5(進程版): 單進程多路I/O復用+多進程I/O復用

 

4.6.7模型6: 單線程多路I/O復用+多線程I/O復用+多線程

 

4.7小結

 

第二篇Go語言編程進階之路

 

 

第5章有關Goroutine無限創建的分析

 

5.1從操作系統分析進程、線程、協程的區別

 

5.1.1進程內存

 

5.1.2線程內存

 

5.1.3執行單元

 

5.2協程的切換成本

 

5.2.1協程切換成本

 

5.2.2線程切換成本

 

5.2.3內存占用

 

5.3Go是否可以無限創建,如何限定數量

 

5.3.1不控制Goroutine數量引發的問題

 

5.3.2一些簡單方法控制Goroutine的數量

 

5.4動態保活Worker工作池設計

 

5.4.1如何確定一個Goroutine已經死亡

 

5.4.2Worker工作池的設計

 

5.4.3測試Worker工作池

 

5.5小結

 

第6章Go語言中的逃逸現象,變量“何時在棧、何時在堆”

 

6.1Go語言中的逃逸現象

 

6.1.1Go語言中訪問子函數的局部變量

 

6.1.2C/C++中訪問子函數的局部變量

 

6.2逃逸分析過程示例

 

6.2.1示例過程

 

6.2.2new的變量在棧還是堆

 

6.3普遍的逃逸規則

 

6.3.1逃逸範例1

 

6.3.2逃逸範例2

 

6.3.3逃逸範例3

 

6.3.4逃逸範例4

 

6.3.5逃逸範例5

 

6.3.6逃逸範例6

 

6.3.7逃逸範例7

 

6.3.8逃逸範例8

 

6.4小結

 

第7章interface剖析與Go語言中面向對象思想

 

7.1interface的賦值問題

 

7.2非空接口的interface內部構造

 

7.2.1案例分析

 

7.2.2空接口eface

 

7.2.3非空接口iface

 

7.3空接口的interface內部構造

 

7.4interface{}與*interface{}

 

7.5面向對象思維理解interface

 

7.5.1平鋪式的模塊設計

 

7.5.2面向對象中的開閉原則

 

7.5.3接口的意義

 

7.5.4耦合度極高的模塊關系設計

 

7.5.5面向抽象層依賴倒轉設計

 

7.6小結

 

第8章defer踐行中必備的要領

 

8.1defer的執行順序

 

8.2defer與return誰先誰後

 

8.3函數返回值的初始化

 

8.4有名函數返回值遇見defer的情況

 

8.5defer遇見panic

 

8.5.1defer遇見panic,但是並不捕獲異常的情況

 

8.5.2defer遇見panic,並捕獲異常

 

8.6defer中包含panic

 

8.7defer下的函數參數包含子函數

 

8.8小結

 

第9章Go語言中常用的問題及性能調試實踐方法

 

9.1如何分析程序的運行時間與CPU利用率

 

9.1.1shell內置time指令

 

9.1.2/usr/bin/time指令

 

9.2如何分析Go語言程序的內存使用情況

 

9.2.1占用內存情況查看

 

9.2.2GODEBUG與gctrace

 

9.2.3runtime.ReadMemStats

 

9.2.4pprof工具

 

9.3如何獲取Go語言程序的CPU性能情況

 

9.3.1通過Web界面查看且得到profile文件

 

9.3.2使用pprof工具獲取信息

 

9.3.3profile文件獲取信息

 

9.3.4可視化圖形查看及分析

 

9.4小結

 

第10章make和new的原理性區別

 

10.1變量的聲明

 

10.2Go語言中make與new的區別

 

10.2.1new

 

10.2.2make

 

10.2.3make與new的異同

 

10.3slice與new關鍵字

 

10.4小結

 

第11章精通Go Modules項目依賴管理

 

11.1GOPATH的工作模式

 

11.1.1什麽是GOPATH

 

11.1.2GOPATH模式的弊端

 

11.2Go Modules模式

 

11.2.1go mod命令

 

11.2.2go mod環境變量

 

11.2.3GO111MODULE

 

11.2.4GOPROXY

 

11.2.5direct

 

11.2.6GOSUMDB

 

11.2.7GONOPROXY/GONOSUMDB/GOPRIVATE

 

11.3使用Go Modules初始化項目

 

11.3.1開啟Go Modules

 

11.3.2初始化項目

 

11.3.3查看go.mod文件

 

11.3.4查看go.sum文件

 

11.4修改模塊的版本依賴關系

 

11.5小結

 

第12章ACID、CAP、BASE的分佈式理論推進

 

12.1從本地事務到分佈式理論

 

12.2ACID理論

 

12.3CAP理論

 

12.3.1一致性

 

12.3.2可用性

 

12.3.3分區容錯性

 

12.4CAP的“3選2”證明

 

12.4.1基本場景

 

12.4.2CAP特性

 

12.4.3分佈式系統正常運行流程

 

12.4.4分佈式系統異常運行流程

 

12.4.5“3選2”的必然性

 

12.5分佈式BASE理論

 

12.6小結

 

第三篇Go語言框架設計之路

 

 

第13章Zinx框架基礎服務構建

 

13.1初探Zinx架構

 

13.2ZinxV0.1基礎服務

 

13.2.1ZinxV0.1 代碼實現

 

13.2.2Zinx框架單元測試樣例

 

13.2.3使用ZinxV0.1完成應用程序

 

13.3ZinxV0.2簡單的連接封裝與業務綁定

 

13.3.1ZinxV0.2代碼實現

 

13.3.2使用ZinxV0.2完成應用程序

 

13.4小結

 

第14章Zinx框架路由模塊設計與實現

 

14.1IRequest 消息請求抽象類

 

14.1.1創建抽象IRequest層

 

14.1.2實現Request類

 

14.2IRouter 路由配置抽象類

 

14.2.1創建抽象的IRouter層

 

14.2.2實現Router類

 

14.3ZinxV0.3集成簡單路由功能

 

14.3.1IServer增添路由添加功能

 

14.3.2Server類增添Router成員

 

14.3.3Connection類綁定一個Router成員

 

14.3.4在Connection調用註冊的Router處理業務

 

14.4Server傳遞Router參數Connection

 

14.5使用ZinxV0.3完成應用程序

 

14.5.1測試基於Zinx完成的服務器端應用

 

14.5.2啟動Server和Client

 

14.6小結

 

第15章Zinx全局配置

 

15.1ZinxV0.4增添全局配置代碼實現

 

15.2使用ZinxV0.4完成應用程序

 

15.3小結

 

第16章Zinx消息封裝模塊設計與實現

 

16.1創建消息封裝類型

 

16.2消息的封包與拆包

 

16.2.1創建拆包封包抽象類

 

16.2.2實現拆包封包類

 

16.2.3測試拆包封包功能

 

16.3ZinxV0.5代碼實現

 

16.3.1Request字段修改

 

16.3.2集成拆包過程

 

16.3.3提供封包的發送方法

 

16.3.4使用ZinxV0.5完成應用程序

 

16.4小結

 

第17章Zinx多路由模式設計與實現

 

17.1創建消息管理模塊

 

17.1.1創建消息管理模塊抽象類

 

17.1.2實現消息管理模塊

 

17.2ZinxV0.6代碼實現

 

17.3使用ZinxV0.6完成應用程序

 

17.4小結

 

第18章Zinx讀寫分離模型構建

 

18.1ZinxV0.7代碼實現

 

18.2小結

 

第19章Zinx消息隊列和任務工作池設計與實現

 

19.1創建消息隊列

 

19.2創建及啟動Worker工作池

 

19.3將消息發送給消息隊列

 

19.4ZinxV0.8代碼實現

 

19.5使用ZinxV0.8完成應用程序

 

19.6小結

 

第20章Zinx連接管理及屬性設置

 

20.1連接管理

 

20.1.1創建連接管理模塊

 

20.1.2將連接管理模塊集成到Zinx中

 

20.1.3連接的帶緩沖的發包方法

 

20.1.4註冊連接啟動/停止自定義Hook方法功能

 

20.1.5使用ZinxV0.9完成應用程序

 

20.2Zinx的連接屬性設置

 

20.2.1給連接添加連接配置接口

 

20.2.2連接屬性方法實現

 

20.2.3連接屬性ZinxV0.10單元測試

 

20.3小結

 

第21章基於Zinx框架的應用項目案例

 

21.1應用案例介紹

 

21.2MMO多人在線游戲AOI算法

 

21.2.1網絡法實現AOI算法

 

21.2.2實現AOI格子結構

 

21.2.3實現AOI管理模塊

 

21.2.4求出九宮格

 

21.2.5AOI管理區域格子添加刪除操作

 

21.2.6AOI模塊單元測試

 

21.3數據傳輸協議Protocol Buffer

 

21.3.1Protocol Buffer簡介

 

21.3.2數據交換格式

 

21.3.3ProtoBuf環境安裝

 

21.3.4ProtoBuf語法

 

21.3.5編譯ProtoBuf

 

21.3.6基於ProtoBuf協議的Go語言編程

 

21.4MMO游戲服務器應用協議

 

21.4.1協議定義

 

21.4.2Proto3協議定義

 

21.5構建項目與用戶上線

 

21.5.1構建項目

 

21.5.2用戶上線流程

 

21.6世界聊天系統實現

 

21.6.1世界管理模塊

 

21.6.2世界聊天系統實現

 

21.7上線位置信息同步

 

21.8移動位置與未跨越格子的AOI廣播

 

21.9玩家下線

 

21.10移動與跨越格子的AOI廣播

 

21.11小結