Go语言精进之路 : 从新手到高手的编程思想、方法和技巧 2

0
(0)

Go语言精进之路
: 从新手到高手的编程思想、方法和技巧 2

作者:白明

出版社:机械工业出版社

副标题:从新手到高手的编程思想、方法和技巧2

出版年:2021-12-17

页数:479

装帧:平装

丛书:华章程序员书库

ISBN:9787111698227

内容简介
······

Go入门容易,精进难,如何才能像Go开发团队那样写出符合Go思维和语言惯例的高质量代码呢?

本书将从编程思维和实践技巧2个维度给出答案,帮助你在Go进阶的路上事半功倍。

编程思维层面

只有真正领悟了一门语言的设计哲学和编程思维,并能将之用于实践,才算精通了这门语言。本书从Go语言设计者的视角对Go背后的设计哲学和编程思想进行了梳理和分析,指引读者体会那些看似随意实则经过深思熟虑的设计背后的秘密。

实践技巧层面

实践技巧源于对Go开发团队和Go社区开发的高质量代码的阅读、挖掘和归纳,从项目结构、代码风格、语法及其实现、接口、并发、同步、错误与异常处理、测试与调试、性能优化、标准库、三方库、工具链、Z佳实践、工程实践等多个方面给出了改善Go代码质量、写出符合 Go 思维和惯例的代码的有效实践。

全书的内容覆盖如下10个大类,共66个主题,字字珠玑,句句箴言。

(1)Go语言的一切

(2)项目结构、代码风格与标识符命名

(3)声明、类型、语句与控制结构

(4)函数与方法

(5)接口

(6)并发编程

(7)错误处理

(8)测试、性能剖析与调试

(9)标准库、反与cgo

(10)工具链与工程实践

学完这本书,你将拥有和 Go专家一样的编程思维,写出符合Go惯例和风格的高质量代码,从众多 Go 初学者中脱颖而出,快速实现从Go新手到专家的转变!

作者简介
······

白明(Tony Bai)

资深Go技术专家和架构师,有过10年的服务端架构设计和开发经验,擅长服务器后端编程。曾任东软集团开发部技术总监和东网科技高级架构师,现为东软睿驰智能网联汽车业务线精通车联网平台的高级架构师。精通Go、C、Python、Shell、Linu、Rancher、Docker、OpenStack、Kubernetes等技术栈。

《七周七语言》译者之一,GopherChina大会、开源中国源创会讲师,麦思博客座培训师,tonybai.com技术博客博主。

目录
······

推荐序

前言

一部分 熟知Go语言的一切

1条 了解Go语言的诞生与演进

1.1 Go语言的诞生

1.2 Go语言的早期团队和演进历程

1.3 Go语言正式发布并开源

2条 选择适当的Go语言版本

2.1 Go语言的先祖

2.2 Go语言的版本发布历史

2.3 Go语言的版本选择建议

3条 理解Go语言的设计哲学

3.1 追求简单,少即是多

3.2 偏好组合,正交解耦

3.3 原生并发,轻量高效

3.4 面向工程,“自带电池”

4条 使用Go语言原生编程思维来写Go代码

4.1 语言与思维—来自大师的观点

4.2 现实中的“投影”

4.3 Go语言原生编程思维

二部分 项目结构、代码风格与标识符命名

5条 使用得到公认且广泛使用的项目结构

5.1 Go项目的项目结构

5.2 Go语言典型项目结构

6条 提交前使用gofmt格式化源码

6.1 gofmt:Go语言在解决规模化问题上的佳实践

6.2 使用gofmt

6.3 使用goimports

6.4 将gofmt/goimports与IDE或编辑器工具集成

7条 使用Go命名惯例对标识符进行命名

7.1 简单且一致

7.2 利用上下文环境,让短的名字

携带足够多的信息

三部分 声明、类型、语句与

控制结构

8条 使用一致的变量声明形式

8.1 包级变量的声明形式

8.2 局部变量的声明形式

9条 使用无类型常量简化代码

9.1 Go常量溯源

9.2 有类型常量带来的烦恼

9.3 无类型常量消除烦恼,简化代码

10条 使用iota实现枚举常量

11条 尽量定义零值可用的类型

11.1 Go类型的零值

11.2 零值可用

12条 使用复合字面值作为初值构造器

12.1 结构体复合字面值

12.2 数组/切片复合字面值

12.3 map复合字面值

13条 了解切片实现原理并高效使用

13.1 切片究竟是什么

13.2 切片的高级特性:动态扩容

13.3 尽量使用cap参数创建切片

14条 了解map实现原理并高效使用

14.1 什么是map

14.2 map的基本作

14.3 map的内部实现

14.4 尽量使用cap参数创建map

15条 了解string实现原理并高效使用

15.1 Go语言的字符串类型

15.2 字符串的内部表示

15.3 字符串的高效构造

15.4 字符串相关的高效转换

16条 理解Go语言的包导入

16.1 Go程序构建过程

16.2 究竟是路径名还是包名

16.3 包名冲突问题

17条 理解Go语言表达式的求值顺序

17.1 包级别变量声明语句中的表达式求值顺序

17.2 普通求值顺序

17.3 赋值语句的求值

17.4 switch/select语句中的表达式求值

18条 理解Go语言代码块与作用域

18.1 Go代码块与作用域简介

18.2 if条件控制语句的代码块

18.3 其他控制语句的代码块规则简介

19条 了解Go语言控制语句惯用法及使用注意事项

19.1 使用if控制语句时应遵循“快乐路径”原则

19.2 for range的避“坑”指南

19.3 break跳到哪里去了

19.4 尽量用case表达式列表替代fallthrough

部分 函数与方法

20条 在init函数中检查包级变量的初始状态

20.1 认识init函数

20.2 程序初始化顺序

20.3 使用init函数检查包级变量的初始状态

21条 让自己习惯于函数是“一等公民”

21.1 什么是“一等公民”

21.2 函数作为“一等公民”的特殊运用

22条 使用defer让函数更简洁、更健壮

22.1 defer的运作机制

22.2 defer的常见用法

22.3 关于defer的几个关键问题

23条 理解方法的本质以选择正确的receiver类型

23.1 方法的本质

23.2 选择正确的receiver类型

23.3 基于对Go方法本质的理解巧解难题

24条 方法集合决定接口实现

24.1 方法集合

24.2 类型嵌入与方法集合

24.3 defined类型的方法集合

24.4 类型别名的方法集合

25条 了解变长参数函数的妙用

25.1 什么是变长参数函数

25.2 模拟函数重载

25.3 模拟实现函数的可选参数与默认参数

25.4 实现功能选项模式

五部分 接口

26条 了解接口类型变量的内部表示

26.1 nil error值 != nil

26.2 接口类型变量的内部表示

26.3 输出接口类型变量内部表示的详细信息

26.4 接口类型的装箱原理

27条 尽量定义小接口

27.1 Go推荐定义小接口

27.2 小接口的优势

27.3 定义小接口可以遵循的一些点

28条 尽量避免使用空接口作为函数参数类型

29条 使用接口作为程序水平组合的连接点

29.1 一切皆组合

29.2 垂直组合回顾

29.3 以接口为连接点的水平组合

30条 使用接口提高代码的可测试性

30.1 实现一个附加免责声明的电子邮件发送函数

30.2 使用接口来降低耦合

六部分 并发编程

31条 优先考虑并发设计

31.1 并发与并行

31.2 Go并发设计实例

32条 了解goroutine的调度原理

32.1 goroutine调度器

32.2 goroutine调度模型与演进过程

32.3 对goroutine调度器原理的进一步理解

32.4 调度器状态的查看方法

32.5 goroutine调度实例简要分析

33条 掌握Go并发模型和常见并发模式

33.1 Go并发模型

33.2 Go常见的并发模式

34条 了解channel的妙用

34.1 无缓冲channel

34.2 带缓冲channel

34.3 nil channel的妙用

34.4 与select结合使用的一些惯用法

35条 了解sync包的正确用法

35.1 sync包还是channel

35.2 使用sync包的注意事项

35.3 互斥锁还是读写锁

35.4 条件变量

35.5 使用sync.Once实现单例模式

35.6 使用sync.Pool减轻垃圾回收压力

36条 使用atomic包实现伸缩性更好的并发读取

36.1 atomic包与原子作

36.2 对共享整型变量的无锁读写

36.3 对共享自定义类型变量的无锁读写

七部分 错误处理

37条 了解错误处理的4种策略

37.1 构造错误值

37.2 透明错误处理策略

37.3 “哨兵”错误处理策略

37.4 错误值类型检视策略

37.5 错误行为特征检视策略

38条 尽量优化反复出现的if err != nil

38.1 两种观点

38.2 尽量优化

38.3 优化思路

39条 不要使用panic进行正常的错误处理

39.1 Go的panic不是Java的checked eception

39.2 panic的典型应用

39.3 理解panic的输出信息

(以上为1册内容,以下为本书内容。)

八部分 测试、性能剖析与调试

40条 理解包内测试与包外测试的差别2

40.1 官方文档的“自相矛盾”2

40.2 包内测试与包外测试3

41条 有层次地组织测试代码9

41.1 经典模式—平铺9

41.2 Unit家族模式10

41.3 测试固件13

42条 优先编写表驱动的测试20

42.1 Go测试代码的一般逻辑20

42.2 表驱动的测试实践21

42.3 表驱动测试的优点22

42.4 表驱动测试实践中的注意事项23

43条 使用testdata管理测试依赖的外部数据文件28

43.1 testdata目录28

43.2 golden文件惯用法32

44条 正确运用fake、stub和mock等辅助单元测试35

44.1 fake:真实组件或服务的简化实现版替身36

44.2 stub:对返回结果有一定预设控制能力的替身39

44.3 mock:专用于行为观察和验证的替身44

45条 使用模糊测试让潜在bug无处遁形48

45.1 模糊测试在挖掘Go代码的潜在bug中的作用49

45.2 go-fuzz的初步工作原理49

45.3 go-fuzz使用方法51

45.4 使用go-fuzz建立模糊测试的示例54

45.5 让模糊测试成为“一等公民”58

46条 为被测对象建立性能基准60

46.1 性能基准测试在Go语言中是“一等公民”60

46.2 顺序执行和并行执行的性能基准测试62

46.3 使用性能基准比较工具69

46.4 排除额外干扰,让基准测试更精确72

47条 使用pprof对程序进行性能剖析76

47.1 pprof的工作原理76

47.2 使用pprof进行性能剖析的实例90

48条 使用epvar输出度量数据,辅助定位性能瓶颈点101

48.1 epvar包的工作原理102

48.2 自定义应用通过epvar输出的度量数据105

48.3 输出数据的展示110

49条 使用Delve调试Go代码112

49.1 关于调试,你首先应该知道的几件事112

49.2 Go调试工具的选择114

49.3 Delve调试基础、原理与架构116

49.4 并发、Coredump文件与挂接进程调试125

九部分 标准库、反与cgo

50条 理解Go TCP Socket网络编程模型136

50.1 TCP Socket网络编程模型137

50.2 TCP连接的建立142

50.3 Socket读写145

50.4 Socket属性155

50.5 关闭连接156

51条 使用net/***包实现安全通信158

51.1 HTTPS:在安全传输层上运行的HTTP协议158

51.2 HTTPS安全传输层的工作机制161

51.3 非对称加密和公钥证书164

51.4 对服务端公钥证书的校验169

51.5 对客户端公钥证书的校验172

52条 掌握字符集的原理和字符编码方案间的转换175

52.1 字符与字符集175

52.2 Unicode字符集的诞生与UTF-8编码方案177

52.3 字符编码方案间的转换179

53条 掌握使用time包的正确方式187

53.1 时间的基础作187

53.2 时间的格式化输出196

53.3 定时器的使用199

54条 不要忽略对系统信号的处理209

54.1 为什么不能忽略对系统信号的处理209

54.2 Go语言对系统信号处理的支持210

54.3 使用系统信号实现程序的优雅出216

55条 使用crypto下的密码学包构建安全应用219

55.1 Go密码学包概览与设计原则219

55.2 分组密码算法221

55.3 公钥密码228

55.4 单向散列函数231

55.5 消息认证码233

55.6 数字签名235

55.7 随机数生成238

56条 掌握bytes包和strings包的基本作240

56.1 查找与替换241

56.2 比较244

56.3 分割246

56.4 拼接248

56.5 修剪与变换249

56.6 快速对接I/O模型252

57条 理解标准库的读写模型254

57.1 直接读写字节序列255

57.2 直接读写抽象数据类型实例257

57.3 通过包裹类型读写数据263

58条 掌握unsafe包的安全使用模式269

58.1 简洁的unsafe包 270

58.2 unsafe包的典型应用273

58.3 正确理解unsafe.Pointer与uintptr277

58.4 unsafe.Pointer的安全使用模式280

59条 谨慎使用reflect包提供的反能力288

59.1 Go反的三大法则288

59.2 反世界的入口291

59.3 反世界的出口295

59.4 输出参数、interface{}类型变量及反对象的可设置性295

60条 了解cgo的原理和使用开销300

60.1 Go调用C代码的原理300

60.2 在Go中使用C语言的类型302

60.3 在Go中***外部C库307

60.4 在C中使用Go函数309

60.5 使用cgo的开销309

60.6 使用cgo代码的静态构建314

十部分 工具链与工程实践

61条 使用module管理包依赖320

61.1 Go语言包管理演进回顾320

61.2 Go module:Go包依赖管理的生产标准324

61.3 Go module代理339

61.4 升级module的主版本号342

62条 构建小Go程序容器镜像350

62.1 镜像:继承中的创新350

62.2 “镜像是个筐”:初学者的认知351

62.3 理性回归:builder模式的崛起353

62.4 “像赛车那样减重”:追求小镜像355

62.5 “要有光”:对多阶段构建的支持357

63条 自定义Go包的导入路径359

63.1 govanityurls360

63.2 使用govanityurls361

64条 熟练掌握Go常用工具367

64.1 获取与安装367

64.2 包或module检视373

64.3 构建380

64.4 运行与诊断390

64.5 格式化与静态代码检查398

64.6 重构402

64.7 查看文档412

64.8 代码导航与洞察419

65条 使用go generate驱动代码生成421

65.1 go generate:Go原生的代码生成“驱动器”421

65.2 go generate的工作原理423

65.3 go generate的应用场景425

66条 牢记Go的常见“陷阱”430

66.1 语法规范类431

66.2 标准库类455

评论 ······

侧重工具链和平常开发中不太常用的功能,和第一本一样用心

工具和进阶吧,简单翻阅了一遍,还是需要多写之后才有深入的需要吧。

上一本绝对是雅俗共赏,这本基本上是技术知识科普加手册,略显乏味

可以再精简些

点击星号评分!

平均分 0 / 5. 投票数: 0

还没有投票!请为他投一票。

评论 抢沙发

评论前必须登录!

 

登录

找回密码

注册