作品简介

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

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

编程思维层面

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

实践技巧层面

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

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

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

作品目录

  • 作者简介
  • 推荐语
  • 推荐序
  • 前言
  • 第八部分 测试、性能剖析与调试
  • 第40条 理解包内测试与包外测试的差别
  • 40.1 官方文档的“自相矛盾”
  • 40.2 包内测试与包外测试
  • 第41条 有层次地组织测试代码
  • 41.1 经典模式——平铺
  • 41.2 xUnit家族模式
  • 41.3 测试固件
  • 第42条 优先编写表驱动的测试
  • 42.1 Go测试代码的一般逻辑
  • 42.2 表驱动的测试实践
  • 42.3 表驱动测试的优点
  • 42.4 表驱动测试实践中的注意事项
  • 第43条 使用testdata管理测试依赖的外部数据文件
  • 43.1 testdata目录
  • 43.2 golden文件惯用法
  • 第44条 正确运用fake、stub和mock等辅助单元测试
  • 44.1 fake:真实组件或服务的简化实现版替身
  • 44.2 stub:对返回结果有一定预设控制能力的替身
  • 44.3 mock:专用于行为观察和验证的替身
  • 第45条 使用模糊测试让潜在bug无处遁形
  • 45.1 模糊测试在挖掘Go代码的潜在bug中的作用
  • 45.2 go-fuzz的初步工作原理
  • 45.3 go-fuzz使用方法
  • 45.4 使用go-fuzz建立模糊测试的示例
  • 45.5 让模糊测试成为“一等公民”
  • 第46条 为被测对象建立性能基准
  • 46.1 性能基准测试在Go语言中是“一等公民”
  • 46.2 顺序执行和并行执行的性能基准测试
  • 46.3 使用性能基准比较工具
  • 46.4 排除额外干扰,让基准测试更精确
  • 第47条 使用pprof对程序进行性能剖析
  • 47.1 pprof的工作原理
  • 47.2 使用pprof进行性能剖析的实例
  • 第48条 使用expvar输出度量数据,辅助定位性能瓶颈点
  • 48.1 expvar包的工作原理
  • 48.2 自定义应用通过expvar输出的度量数据
  • 48.3 输出数据的展示
  • 第49条 使用Delve调试Go代码
  • 49.1 关于调试,你首先应该知道的几件事
  • 49.2 Go调试工具的选择
  • 49.3 Delve调试基础、原理与架构
  • 49.4 并发、Coredump文件与挂接进程调试
  • 第九部分 标准库、反射与cgo
  • 第50条 理解Go TCP Socket网络编程模型
  • 50.1 TCP Socket网络编程模型
  • 50.2 TCP连接的建立
  • 50.3 Socket读写
  • 50.4 Socket属性
  • 50.5 关闭连接
  • 第51条 使用net/http包实现安全通信
  • 51.1 HTTPS:在安全传输层上运行的HTTP协议
  • 51.2 HTTPS安全传输层的工作机制
  • 51.3 非对称加密和公钥证书
  • 51.4 对服务端公钥证书的校验
  • 51.5 对客户端公钥证书的校验
  • 第52条 掌握字符集的原理和字符编码方案间的转换
  • 52.1 字符与字符集
  • 52.2 Unicode字符集的诞生与UTF-8编码方案
  • 52.3 字符编码方案间的转换
  • 第53条 掌握使用time包的正确方式
  • 53.1 时间的基础操作
  • 53.2 时间的格式化输出
  • 53.3 定时器的使用
  • 第54条 不要忽略对系统信号的处理
  • 54.1 为什么不能忽略对系统信号的处理
  • 54.2 Go语言对系统信号处理的支持
  • 54.3 使用系统信号实现程序的优雅退出
  • 第55条 使用crypto下的密码学包构建安全应用
  • 55.1 Go密码学包概览与设计原则
  • 55.2 分组密码算法
  • 55.3 公钥密码
  • 55.4 单向散列函数
  • 55.5 消息认证码
  • 55.6 数字签名
  • 55.7 随机数生成
  • 第56条 掌握bytes包和strings包的基本操作
  • 56.1 查找与替换
  • 56.2 比较
  • 56.3 分割
  • 56.4 拼接
  • 56.5 修剪与变换
  • 56.6 快速对接I/O模型
  • 第57条 理解标准库的读写模型
  • 57.1 直接读写字节序列
  • 57.2 直接读写抽象数据类型实例
  • 57.3 通过包裹类型读写数据
  • 第58条 掌握unsafe包的安全使用模式
  • 58.1 简洁的unsafe包
  • 58.2 unsafe包的典型应用
  • 58.3 正确理解unsafe.Pointer与uintptr
  • 58.4 unsafe.Pointer的安全使用模式
  • 第59条 谨慎使用reflect包提供的反射能力
  • 59.1 Go反射的三大法则
  • 59.2 反射世界的入口
  • 59.3 反射世界的出口
  • 59.4 输出参数、interface{}类型变量及反射对象的可设置性
  • 第60条 了解cgo的原理和使用开销
  • 60.1 Go调用C代码的原理
  • 60.2 在Go中使用C语言的类型
  • 60.3 在Go中链接外部C库
  • 60.4 在C中使用Go函数
  • 60.5 使用cgo的开销
  • 60.6 使用cgo代码的静态构建
  • 第十部分 工具链与工程实践
  • 第61条 使用module管理包依赖
  • 61.1 Go语言包管理演进回顾
  • 61.2 Go module:Go包依赖管理的生产标准
  • 61.3 Go module代理
  • 61.4 升级module的主版本号
  • 第62条 构建最小Go程序容器镜像
  • 62.1 镜像:继承中的创新
  • 62.2 镜像是个筐:初学者的认知
  • 62.3 理性回归:builder模式的崛起
  • 62.4 “像赛车那样减重”:追求最小镜像
  • 62.5 “要有光”:对多阶段构建的支持
  • 第63条 自定义Go包的导入路径
  • 63.1 govanityurls
  • 63.2 使用govanityurls
  • 第64条 熟练掌握Go常用工具
  • 64.1 获取与安装
  • 64.2 包或module检视
  • 64.3 构建
  • 64.4 运行与诊断
  • 64.5 格式化与静态代码检查
  • 64.6 重构
  • 64.7 查看文档
  • 64.8 代码导航与洞察
  • 第65条 使用go generate驱动代码生成
  • 65.1 go generate:Go原生的代码生成“驱动器”
  • 65.2 go generate的工作原理
  • 65.3 go generate的应用场景
  • 第66条 牢记Go的常见“陷阱”
  • 66.1 语法规范类
  • 66.2 标准库类
展开全部