聊一聊《深入 Go 语言原理、关键技术和实战》(文末送书)

程序员历小冰

共 5676字,需浏览 12分钟

 ·

2023-09-01 10:25

距离上次出版《Go语言高并发和微服务实战》一书已经过去了3年 ,看着手中刚收到的《深入 Go 语言原理、关键技术和实战》,不仅思绪万千。 从21年初开始筹划到今年4月份最终出版,一共花费了两年左右的时间,个中滋味以及对此书的寄托,尽在此文,慢慢向大家说来。


缘由

和鑫哥 @a oho  和黄总 @CANG WU  早前已经合作编写并出版了 《Go语言高 并发和微服务实战》 一书,主要讲解 Go 入门语法和微服务领域实战。但是对于 Go 语言本身语法和特性并未深入了解,随着日常使用 Go 语言开发开源项目,我们越发觉得 Go 语言语法虽然简洁,但是背后的原理和实现却很复杂,无论是协程,Channel 还是 Go 语言的泛型系统,如果不了解它的原理,就很容易发生错误。所以,我们决定全面深入学习 Go 语言的特性实现,从 Go 语言源码入手,详细介绍 Go 语言各类语法和特性的原理,实现和调优方式。由此,形成了本书的主体内容和大纲。

后续就是大家按照自己熟悉的领域划划分章节,各自去准备材料,设计代码,编辑初稿,自我审阅;然后交换审阅,按照审阅意见修改;交给编辑审阅,再修改,再审阅,再修改.... 一本书,不仅包含了两年的时光,也倾注了三人和编辑们的付出和努力


6976bd4f754e4b919c67c6eea07df2d5.webp

随着 Go 1.18 等重大版本发布,Go语言更加成熟,机制更加完善,缺点更加少;Go 相关的开源项目比如 Docker,Etcd,Prometheus 都已经成为顶级开源项目,使用 Go 编写的小型中间件项目更是数不尽数;头条,滴滴,腾讯,b站等各大公司也都正在使用 Go 或者将原有项目迁移到 Go。所以,Go 语言在未来一段时间会持续流行,甚至变得更加流行,超越 Java。


本书内容以介绍 Go 语言特性及其底层实现原理为主线 ,也会将  Go  语言和其他主流语言进行对比,比如说 C++、Java 和 Rust,通过对比让读者更加了解语言特性背后的原理和实现机制,为后续学习其他语言打下良好基础。 本书包含三个部分的内容:

  • 第一部分,浅谈高级编程语言历史和分类,讲述Go 语言最鲜明的语法特征,介绍Go 语言常用数据结构和并发原语。

  • 第二部分,依次深入介绍Go 语言特性的原理及其实现。

  • 第三部分,通过开源项目深入了解Go 语言特性,并介绍Go 语言相关的最佳实践(如工程化和etcd 存储)。


b2c1300b100366865555d10b6f86f21d.webp

欢迎购买笔者的图书,现已出版上市,可以通过下方的二维码购买。


353d1016b09e364e73cd209ae9974fe4.webp


书籍目录如下所示

第1章 高级编程语言以及Go 语言基础

1.1 高级语言简介1

1.1.1 程序设计语言的定义2

1.1.2 程序设计语言的发展历史 4

1.1.3 高级语言分类5

1.2 为什么要研究编程语言8

1.2.1 当今流行编程语言的概况 8

1.2.2 效率是程序语言流行的决定因素 9

1.2.3 了解高级语言的重要性 12

1.3 本书的主角:Go 语言13

1.3.1 体现Go 语言特性的五个关键词14

1.3.2 Go 语言基础语法15

1.4 本章小结 23

第2 章 数据结构源码分析

2.1 数组 24

2.1.1 数组的基础使用25

2.1.2 数组的底层数据结构27

2.1.3 数组的越界检查29

2.2 字符串 30

2.2.1 Go 语言字符串的基础操作 30

2.2.2 Go 语言字符串的底层数据结构 33

2.2.3 Go 语言字符串的拼接 34

2.2.4 Go 语言字符串的类型转换 35

2.3 切片 37

2.3.1 切片的基础操作37

2.3.2 切片的底层数据结构38

2.3.3 切片的追加操作39

2.3.4 切片的删除操作43

2.4 哈希表 44

2.4.1 哈希表的基础操作44

2.4.2 哈希表底层数据结构45

2.4.3 哈希表的初始化47

2.4.4 哈希表的读取操作49

2.4.5 哈希表的写入操作50

2.4.6 删除操作53

2.4.7 哈希表的扩容操作54

2.5 本章小结 60

第3 章 Go 语言的并发结构

3.1 锁控制 61

3.1.1 互斥锁Mutext62

3.1.2 读/写锁RWMutext 69

3.2 协程编排 71

3.2.1 协同等待的WaitGroup72

3.2.2 只执行一次的Once  75

3.2.3 请求合并的SingleFlight76

3.3 协程安全的数据结构80

3.3.1 读写锁实现80

3.3.2 分片加锁实现81

3.3.3 sync.Map 实现 83

3.3.4 性能评测实验89

3.4 本章小结 90

第4 章 Go 语言内存分配和垃圾回收机制

4.1 Linux 内存空间布局 91

4.2 Go 语言内存分配机制94

4.2.1 Go 语言内存空间的状态机 95

4.2.2 内存管理单元mspan  96

4.2.3 内存线程缓存mcache  98

4.2.4 内存中心缓存mcentral  99

4.2.5 页堆mheap 100

4.2.6 内存分配函数newObject 101

4.2.7 各级内存组件功能的实现 106

4.2.8 实验:打印内存分配相关日志 119

4.3 Go 语言垃圾回收机制120

4.3.1 Go 语言垃圾回收的基础原理 120

4.3.2 Go 语言垃圾回收流程 124

4.3.3 垃圾回收触发时机125

4.3.4 清理终止阶段和开启标记阶段 129

4.3.5 标记阶段132

4.3.6 标记终止阶段150

4.3.7 内存清理152

4.4 本章小结 155

第5 章 Go 语言协程

5.1 进程与线程 156

5.1.1 进程和线程的概念156

5.1.2 进程与线程的区别160

5.1.3 并发与并行161

5.2 协程的诞生 162

5.2.1 协程诞生的背景162

5.2.2 协程的工作机制和优势 162

5.2.3 协程、线程、进程的差异 164

5.3 Go 语言的调度器goroutine164

5.3.1 Go context 上下文164

5.3.2 Go 语言并发模型169

5.3.3 Go 调度模型概览170

5.3.4 调度器的实现原理173

5.4 Go 语言运行时的系统监控179

5.4.1 监控循环与死锁检查180

5.5 goroutine 之间的通信:channel  182

5.5.1 channel 的设计与结构183

5.5.2 channel 的使用 185

5.5.3 解决channel 阻塞:select 189

5.5.4 goroutine 与channel 的结合案例 192

5.5.5 并发问题是选Mutex 还是选channel  194

5.6 本章小结:goroutine 是银弹吗195

第6 章 Go 语言网络并发处理

6.1 网络并发处理的演变196

6.1.1 程序设计导致的C10K 问题 197

6.1.2 操作系统调优的C1000K 问题 200

6.1.3 更进一步的C10M 问题201

6.2 Reactor 请求处理模式202

6.2.1 Reactor 模式简介 202

6.2.2 Getty 网络库介绍207

6.3 HTTP 请求处理 212

iv 深入Go 语言:原理、关键技术与实战

6.3.1 net/http 包解析 213

6.3.2 Go Fasthttp 解析217

6.4 本章小结 225

第7 章 Go 语言错误处理机制

7.1 代码中的错误与异常226

7.2 Go 语言的错误处理哲学:Errors are values  227

7.2.1 error 接口227

7.2.2 对error 进行编程230

7.3 处理异常并恢复230

7.3.1 基本使用方式230

7.3.2 defer 延时执行的实现原理 234

7.3.3 panic 终止程序和recover 从panic 中恢复的原理 248

7.4 本章小结 252

第8 章 Go 语言的类型系统

8.1 编程语言类型系统简介253

8.1.1 用户自定义类型254

8.1.2 抽象数据类型257

8.1.3 面向对象编程258

8.2 Go 语言类型底层实现265

8.2.1 Go 语言结构体底层实现 265

8.2.2 嵌入底层实现271

8.2.3 接口底层实现273

8.2.4 接口函数调用和动态派发 278

8.3 本章小结 280

第9 章 Go 语言的泛型和反射

9.1 Go 语言的泛型281

9.1.1 Go 语言泛型基础理念 281

9.1.2 泛型的必要性282

9.2 Go 语言的泛型特性283

9.2.1 Go 语言泛型的理念 284

9.2.2 Go 语言泛型语法284

9.2.3 Go 语言泛型的实现 287

9.3 Go 语言反射机制290

9.3.1 Go 语言反射技术简介 291

9.3.2 Go 语言反射使用 292

9.4 Go 语言反射实现300

9.4.1 获取反射对象301

9.4.2 更新变量304

9.4.3 调用函数305

9.5 本章小结 308

第10 章 Go 语言工程化实践

10.1 日志 309

10.1.1 日志级别309

10.1.2 日志格式310

10.1.3 日志框架311

10.2 代码测试 329

10.2.1 单元测试330

10.2.2 基准测试333

10.3 Go 语言调试339

10.3.1 GDB 调试 340

10.3.2 使用Delve 进行调试 343

10.4 Go 语言性能分析347

10.4.1 普通应用程序的性能分析 348

10.4.2 后台服务程序的性能分析 352

10.4.3 利用go-torch 生成火焰图 357

10.4 本章小结 359

第11 章 etcd 存储原理与机制

11.1 etcd 整体架构360

11.1.1 etcd 项目结构360

11.1.2 etcd 整体架构 362

11.2 etcd 交互总览363

11.3 读/写请求的处理过程 367

11.3.1 读操作的过程367

11.3.2 写操作的过程370

11.4 WAL 日志与备份快照372

11.4.1 WAL 日志373

11.4.2 快照备份375

11.4.3 WAL 存储 377

11.4.4 WAL 日志打开 382

11.4.5 WAL 文件读取 384

11.5 backend 存储 387

11.5.1 BoltDB 相关概念 387

11.5.2 Backend 与BackendTx 接口 388

11.6 本章小结392

第12 章 如何写出更好的Go 语言代码

12.1 Go 语言的最佳实践 393

12.1.1 Go 语言风格的命名方式 393

12.1.2 相似相近原则395

12.1.3 尽早return  396

12.1.4 善用零值397

12.1.5 结构体嵌入原则398

12.1.6 功能选项Option 399

12.2 Go 语言标准目录结构401

12.3 Clean Architecture 与DDD 在Go 语言项目中的应用404

12.3.1 整洁架构404

12.3.2 领域驱动设计406

12.4 综合案例:货运业务项目407

12.4.1 项目需求分析408

12.4.2 项目目录结构410

12.4.3 具体实现411

12.5 本章小结 416


浏览 55
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报