《深入理解Go语言》

711 阅读10分钟

61366-4深入理解Go语言-长banner.jpg

**内容简介**

本书为深入理解学习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语言特性的计算机软件学者等。

目录

第一篇:Golang修炼必经之路

第1章入理解Golang协程调度器GPM模型

1.1 Golang“调度器”的由来

1.1.1 单进程时代不需要调度器

1.1.2 多进程/线程时代的调度器需求

1.1.3 协程提高CPU的利用率

1.1.4 Go语言的协程Goroutine

1.1.5 被废弃的Goroutine调度器

1.2 Goroutine调度器GPM模型的设计思想

1.2.1 GPM模型

1.2.2 调度器的设计策略

1.2.3 go func() 调度流程

1.2.4 调度器的生命周期

1.2.5       可视化GPM编程

1.3 Go调度器调度场景过程全解析

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章Golang混合写屏障的GC全场景分析

2.1 Go V1.3标记-清除算法

2.1.1 标记清除(Mark and Sweep)算法的详细过程

2.1.2 标记清除算法的缺点

2.2 Go V1.5的三色标记法

2.2.1 三色标记法的过程

2.2.2 没有STW的三色标记法

2.2.3 触发三色标记法不安全的必要条件

2.3 Go V1.5 的屏障机制

2.3.1“强-弱”三色不变式

2.3.2 插入屏障

2.3.3 删除屏障

2.4 Go V1.8的混合写屏障

2.4.1 混合写屏障(Hybrid Write Barrier)规则

2.4.2 场景一:堆删除引用,成为栈下游

2.4.3 场景二:栈删除引用,成为栈下游

2.4.3 场景三:堆删除引用,成为堆下游

2.4.4 场景四:栈删除引用,成为堆下游

2.5 小结

第3章 Golang内存管理洗髓经

3.1 何为内存

3.2 内存为什么需要管理

3.3 操作系统是如何管理内存的

3.3.1 虚拟内存

3.3.2 MMU内存管理单元

3.3.3 虚拟内存本身怎么存放

3.3.4 CPU内存访问过程

3.3.4 内存的局部性

3.4 如何用Golang语言实现内存管理和内存池设计

3.4.1 基于Cgo的内存C接口封装

3.4.2 基础内存缓冲Buf实现

3.4.3 内存池设计与实现

3.4.4 内存池的功能单元测试

3.4.5 内存管理应用接口

3.5 Golang内存管理之魂TCMalloc

3.5.1 TCMalloc

3.5.2 TCMalloc模型相关基础结构

3.5.3 ThreadCache

3.5.4 CentralCache

3.5.5 PageHeap

3.5.6 TCMalloc的小对象分配

3.5.7 TCMalloc的中对象分配

3.5.8 TCMalloc的大对象分配

3.6 Golang堆内存管理

3.6.1 Golang内存模型层级结构

3.6.2 Golang内存管理单元相关概念

3.6.3 MCache

3.6.4 MCentral

3.6.5 MHeap

3.6.6 Tiny对象分配流程

3.6.7 小对象分配流程

3.6.8 大对象分配流程

3.7 小结

第4章深入理解Linux网络IO复并发模型

4.1 网络并发模型中的几个基本概念

4.1.1 流

4.1.2 I/O操作

4.1.3 阻塞等待

4.3.2 非阻塞,忙轮询

4.3.3 阻塞与非阻塞对比

4.2 解决阻塞等待缺点的办法

4.2.1 阻塞死等待的缺点

4.2.2 解决阻塞等待的办法一:多线程/多进程

4.2.3 解决阻塞等待的办法二:非阻塞、忙轮询

4.2.4 解决阻塞等待的办法三:select

4.2.5 解决阻塞等待的办法四:epoll

4.3 什么是epoll

4.3.1 Linux提供的epoll的系统调用

4.4 epoll的触发模式

4.4.1 水平触发

4.4.2 边缘触发

4.5 简单的epoll服务器

4.5.1 服务器端实现

4.5.2 客户端实现

4.6 Linux下常见的网络IO复用并发模型

4.6.1 模型一:单线程Accept(无IO复用)

4.6.2 模型二:单线程Accept+多线程读写业务(无IO复用)

4.6.3 模型三:单线程多路IO复用

4.6.4 模型四:单线程多路IO复用+多线程读写业务(业务工作池)

4.6.5 模型五:单线程IO复用+多线程IO复用(链接线程池)

4.6.6 模型五(进程版):单进程多路I/O复用+多进程IO复用

4.6.7 模型六:单线程多路I/O复用+多线程I/O复用+多线程

4.7 小结

第二篇:Golang编程进阶之路

第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.3 Go是否可以无限创建,如何限定数量

5.3.1 不控制Goroutine数量引发的问题

5.3.2 一些简单方法控制Goroutines数量

5.4 动态保活Worker工作池设计

5.4.1 如何确定一个Goroutine已经死亡

5.4.2 Worker工作池的设计

5.4.3 测试Worker工作池

5.5 小结

第6章 Golang中的逃逸现象,变量“何时在栈?何时在堆”

6.1 Golang中逃逸现象

6.1.1 Golang中访问子函数的局部变量

6.1.2 C/C++中访问子函数的局部变量

6.2 逃逸分析过程示例

6.2.1 示例过程

6.2.2 new的变量在栈还是堆?

6.3 普遍的逃逸规则

6.3.1 逃逸范例一

6.3.2 逃逸范例二

6.3.3 逃逸范例三

6.3.4 逃逸范例四

6.3.5 逃逸范例五

6.3.6 逃逸范例六

6.3.7 逃逸范例七

6.3.8 逃逸范例八

6.4 小结

第7章 interface剖析与Golang中面向对象思想

7.1 interface的赋值问题

7.2非空接口的interface内部构造

7.2.1 案例分析

7.2.2 空接口eface

7.2.3 非空接口iface

7.3 空接口的interface内部构造

7.4 interface{}与*interface{}

7.5 面向对象思维理解interface

7.5.1 平铺式的模块设计

7.5.2 面向对象中的开闭原则

7.5.3 接口的意义

7.5.4 耦合度极高的模块关系设计

7.5.5 面向抽象层依赖倒转设计

7.6 小结

第8章 defer践行中的必备要领

8.1 defer的执行顺序

8.2 defer与return谁先谁后

8.3 函数返回值的初始化

8.4 有名函数返回值遇见defer情况

8.5 defer遇见panic

8.5.1 defer遇见panic,但是并不捕获异常的情况

8.5.2 defer遇见panic,并捕获异常

8.6 defer中包含panic

8.7 defer下的函数参数包含子函数

8.9 小结

第9章 Golang中常用的问题及性能调试实践方法

9.1 如何分析程序的运行时间与CPU利用率

29.1.1 shell内置time指令

9.1.2 /usr/bin/time指令

9.2 如何分析Golang程序的内存使用情况

9.2.1 占用内存情况查看

9.2.2 DEBUG与gctrace

9.2.3 runtime.ReadMemStats

9.2.4 pprof工具

9.3 如何获取Golang程序的CPU性能情况

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

9.3.2 使用pprof工具获取信息

9.3.3 profile文件获取信息

9.3.4 可视化图形查看及分析

9.4 小结

第10章 make和new的原理性区别

10.1 变量的声明

10.2 Golang中make与new有何区别?

10.2.1 new

10.2.2 make

10.2.3 make与new的异同

10.3 slice与new关键字

10.4 小结

第11章精通Go Modules项目依赖管理

11.1 GOPATH的工作模式

11.1.1 什么是GOPATH

11.1.2 GOPATH模式的弊端

11.2 Go Modules模式

11.2.1 go mod命令

11.2.2 go mod环境变量

11.2.3 GO111MODULE

11.2.4 GOPROXY

11.2.5 direct

11.2.6 GOSUMDB

11.2.7 GONOPROXY/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.2 ACID理论

12.3 CAP理论

12.3.1 一致性Consistency

12.3.2 可用性(Availability)

12.3.3 分区容错性(Partition tolerance)

12.4 CAP的“3选2”证明

12.4.1 基本场景

12.4.2 CAP特性

12.4.3 分布式系统正常运行流程

12.4.4 分布式系统异常运行流程

12.4.5 “3选2”的必然性

12.5 分布式BASE理论

12.5.1 BASE理论

12.6 小结

第三篇:Golang框架设计之路

第13章 Zinx框架基础服务构建

13.1 初探Zinx架构

13.2 Zinx-V0.1基础Server

13.2.1 Zinx-V0.1 代码实现

13.2.2 Zinx框架单元测试样例

13.2.3 使用Zinx-V0.1完成应用程序

13.3 Zinx-V0.2简单的连接封装与业务绑定

13.3.1 Zinx-V0.2代码实现

13.3.2 使用Zinx-V0.2完成应用程序

13.4 小结

第14章 Zinx框架路由模块设计与实现

14.1 IRequest 消息请求抽象类

14.1.1 创建抽象IRequest层

14.1.2 实现Request类

14.2 IRouter 路由配置抽象类

14.2.1 创建抽象的IRouter层

14.2.2 实现Router类

14.3 Zinx-V0.3集成简单路由功能

14.3.1 IServer增添路由添加功能

14.3.2 Server类增添Router成员

14.3.3 Connection类绑定一个Router成员

14.3.4 在Connection调用注册的Router处理业务

14.4 Server传递Router参数Connection

14.5 使用Zinx-V0.3完成应用程序

14.5.1 测试基于Zinx完成的服务器端应用

14.5.2 启动Server和Client

14.6 小结

第15章 Zinx全局配置

15.1 Zinx-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.3 Zinx-V0.5代码实现

16.3.1 Request字段修改

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.2 Zinx-V0.6代码实现

17.3 使用Zinx-V0.6完成应用程序

17.4 小结

第18章 Zinx读写分离模型构建

18.1 Zinx-V0.7代码实现

18.2 小结

第19章 Zinx消息队列和任务工作池设计与实现

19.1 创建消息队列

19.2 创建及启动Worker工作池

19.3 发送消息给消息队列

19.4 Zinx-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.2 Zinx的连接属性设置

20.2.1 给链接添加链接配置接口

20.2.2 链接属性方法实现

20.1.3 链接属性Zinx-V0.10单元测试

20.3 小结

第21章基于Zinx框架的应用项目案例

21.1应用案例介绍

21.2 MMO多人在线游戏AOI算法

21.2.1 网络法实现AOI算法

21.2.2 实现AOI格子结构

21.2.3 实现AOI管理模块

21.2.4 求出九宫格

21.2.5 AOI管理区域格子添加删除操作

21.2.6 AOI模块单元测试

21.4 数据传输协议protocol buffer

21.4.1 protocol buffer简介

21.4.2 数据交换格式

21.4.3 Protobuf环境安装

21.4.4 Protobuf语法

21.4.5 编译protobuf

21.4.6 基于Protobuf协议的Golang编程

21.5 MMO游戏服务器应用协议

21.5.1 协议定义

21.5.2 Proto3协议定义

21.6 构建项目与用户上线

21.6.1 构建项目

21.6.2用户上线流程

21.7 世界聊天系统实现

21.7.1 世界管理模块

21.7.2 世界聊天系统实现

21.8 上线位置信息同步

21.9 移动位置与未跨越格子的AOI广播

21.10 玩家下线

21.11 移动与跨越格子的AOI广播

21.12 小结

750.jpg