Go开发实用指南 说明
# Go开发实用指南 说明
Go语言凭借其简洁的语法和务实的惯例,已稳固确立了自身在开发者心中的地位,成为处理网络编程、Web服务、数据处理等领域开发的首选语言。本书旨在为工程师赋能,提供最新的实用方法,以解决常见的编程难题。
本书开篇介绍基础原理,涵盖针对各类项目类型组织包和构建代码结构的有效方法。随后深入探讨实际工程挑战,在网络编程、进程管理、数据库交互、数据管道和测试等方面提供切实可行的解决方案。每一章都提供了可运行的解决方案和适用于生产环境的代码片段,兼顾顺序编程和并发编程环境。
本书中的方法充分利用Go语言的最新特性,如泛型和结构化日志记录,并且主要依赖Go标准库,从而确保对第三方包的依赖降至最低,同时最大化兼容性。
阅读完本书,你将掌握大量经过验证的实践解决方案,加速你的Go开发之旅,自信应对现代软件工程的复杂性。
本书翻译自《Go Recipes for Developers》。
# 面向的读者
本书面向对Go语言有基本了解的开发者。经验更为丰富的开发者也可将其作为参考资料,书中提供的实际示例可应用于多种场景。
# 环境要求
你需要安装Go语言的较新版本(任何高于1.22的版本均可),并将其集成到你喜欢的开发环境中。部分示例程序会用到Docker。
# 章节结构
在本书中,你会经常看到几个标题(准备工作、操作方法……、原理说明……)。为清晰说明如何完成一个方法,各章节结构如下:
- 准备工作:该部分会介绍本方法的预期内容,并说明为实现该方法所需进行的软件设置或初步配置。
- 操作方法……:该部分包含实现该方法所需的步骤。
- 原理说明……:该部分通常会详细解释上一部分的操作。
# 详细目录
前言
第1章 项目组织
- 模块和包
- 技术要求
- 创建模块
- 操作方法
- 创建源文件目录结构
- 操作方法
- 构建和运行程序
- 操作方法
- 导入第三方包
- 操作方法
- 导入特定版本的包
- 操作方法
- 使用模块缓存
- 操作方法
- 使用内部包减少API 表面暴露
- 操作方法
- 使用模块的本地副本
- 操作方法
- 处理多个模块——工作区
- 操作方法
- 管理模块版本
- 操作方法
- 总结与拓展阅读
第2章 字符串处理
- 创建字符串
- 操作方法
- 原理说明
- 格式化字符串
- 操作方法
- 原理说明
- 组合字符串
- 操作方法
- 原理说明
- 处理字符串大小写
- 操作方法
- 原理说明
- 更多内容
- 处理编码
- 操作方法
- 原理说明
- 迭代字符串的字节和符文
- 操作方法
- 原理说明
- 分割字符串
- 操作方法
- 原理说明
- 逐行或逐词读取字符串
- 操作方法
- 原理说明
- 修剪字符串两端
- 操作方法
- 正则表达式
- 验证输入
- 搜索模式
- 从字符串中提取数据
- 操作方法
- 原理说明
- 替换字符串部分内容
- 操作方法
- 模板
- 值替换
- 迭代
- 变量和作用域
- 更多内容——嵌套循环和条件语句
- 处理空行
- 操作方法
- 模板组合
- 操作方法
- 原理说明
- 模板组合——布局模板
- 操作方法
- 原理说明
- 更多内容
- 创建字符串
第3章 日期和时间处理
- 处理Unix时间
- 操作方法
- 日期/时间组件
- 操作方法
- 日期/时间运算
- 操作方法
- 原理说明
- 格式化和解析日期/时间
- 操作方法
- 处理时区
- 操作方法
- 原理说明
- 存储时间信息
- 操作方法
- 原理说明
- 定时器(Tickers)
- 操作方法
- 原理说明
- 计时器(Timers)
- 操作方法
- 原理说明
- 处理Unix时间
第4章 数组、切片和映射的使用
- 处理数组
- 创建数组并传递
- 从数组创建切片
- 操作方法
- 原理说明
- 追加/插入/删除切片元素
- 操作方法
- 原理说明
- 使用切片实现栈
- 操作方法
- 原理说明
- 处理切片
- 创建切片
- 原理说明
- 处理映射
- 定义、初始化和使用映射
- 操作方法
- 使用映射实现集合
- 操作方法
- 原理说明
- 复合键
- 操作方法
- 原理说明
- 使用映射实现线程安全缓存
- 简单缓存
- 操作方法
- 原理说明
- 具有阻塞行为的缓存
- 操作方法
- 原理说明
- 定义、初始化和使用映射
- 处理数组
第5章 类型、结构体和接口的使用
- 创建新类型
- 基于现有类型创建新类型
- 操作方法
- 创建类型安全的枚举
- 操作方法
- 基于现有类型创建新类型
- 创建结构体类型
- 操作方法
- 扩展类型
- 扩展基础类型
- 操作方法
- 原理说明
- 扩展基础类型
- 初始化结构体
- 操作方法
- 定义接口
- 接口作为契约
- 操作方法
- 工厂模式
- 操作方法
- 在使用处定义接口
- 操作方法
- 原理说明
- 接口作为契约
- 使用函数作为接口
- 操作方法
- 原理说明
- 在运行时发现数据类型的能力——测试“实现”关系
- 操作方法
- 原理说明
- 测试接口值是否为已知类型之一
- 操作方法
- 在开发过程中确保类型实现接口
- 操作方法
- 决定方法使用指针接收器还是值接收器
- 操作方法
- 原理说明
- 多态容器
- 操作方法
- 原理说明
- 访问对象中未通过接口直接暴露的部分
- 操作方法
- 从嵌入结构体访问被嵌入结构体
- 操作方法
- 检查接口是否为nil
- 操作方法
- 原理说明
- 创建新类型
第6章 泛型的使用
- 泛型函数
- 编写一个用于数字相加的泛型函数
- 将约束声明为接口
- 使用泛型函数作为访问器和适配器
- 从泛型函数返回零值
- 对泛型参数使用类型断言
- 泛型类型
- 编写类型安全的集合
- 有序映射——使用多个类型参数
- 泛型函数
第7章 并发编程
- 使用goroutine并发执行任务
- 创建goroutine
- 并发运行多个独立函数并等待它们完成
- 使用通道在goroutine之间通信
- 使用通道发送和接收数据
- 从多个goroutine向通道发送数据
- 使用通道收集并发计算的结果
- 使用select语句处理多个通道
- 取消goroutine
- 使用非阻塞select检测取消操作
- 共享内存
- 并发更新共享变量
- 使用goroutine并发执行任务
第8章 错误和异常处理
- 返回和处理错误
- 操作方法
- 原理说明
- 包装错误以添加上下文信息
- 操作方法
- 原理说明
- 比较错误
- 操作方法
- 结构化错误
- 操作方法
- 原理说明
- 从错误树中提取特定错误
- 操作方法
- 原理说明
- 处理异常(Panics)
- 必要时引发异常
- 操作方法
- 从异常中恢复
- 操作方法
- 原理说明
- 在恢复过程中更改返回值
- 操作方法
- 原理说明
- 捕获异常的堆栈跟踪信息
- 操作方法
- 必要时引发异常
- 包装结构化错误
- 操作方法
- 原理说明
- 按类型比较结构化错误
- 操作方法
- 返回和处理错误
第9章 Context包的使用
- 使用Context传递请求作用域的数据
- 操作方法
- 原理说明
- 更多内容
- 使用Context进行取消操作
- 操作方法
- 原理说明
- 使用Context设置超时
- 操作方法
- 原理说明
- 更多内容
- 在服务器中使用取消操作和超时设置
- 操作方法
- 使用Context传递请求作用域的数据
第10章 大数据处理
- 工作池
- 有上限的工作池
- 固定大小的工作池
- 连接池
- 管道
- 无扇出/扇入的简单管道
- 以工作池为阶段的管道
- 有扇出和扇入的管道
- 处理大型结果集
- 使用goroutine流式传输结果
- 工作池
第11章 JSON处理
- 编组/解组基础
- 编码结构体
- 操作方法
- 处理嵌入结构体
- 操作方法
- 不定义结构体进行编码
- 操作方法
- 解码结构体
- 操作方法
- 使用接口、映射和切片进行解码
- 操作方法
- 处理缺失和可选值
- 编码时忽略空字段
- 操作方法
- 解码时处理缺失字段
- 操作方法
- 编码时忽略空字段
- 编码结构体
- 自定义JSON编码/解码
- 编组/解组自定义数据类型
- 操作方法
- 自定义对象键的编组/解组
- 操作方法
- 动态字段名
- 操作方法
- 多态数据结构
- 分两步进行自定义解组
- 操作方法
- 编组/解组自定义数据类型
- 流式处理JSON数据
- 流式传输对象数组
- 操作方法
- 解析对象数组
- 操作方法
- 其他流式处理JSON的方式
- 流式传输对象数组
- 安全注意事项
- 操作方法
- 编组/解组基础
第12章 进程处理
- 运行外部程序
- 操作方法
- 向进程传递参数
- 展开参数
- 通过Shell运行命令
- 从子进程读取输出
- 操作方法
- 向子进程提供输入
- 操作方法
- 更改子进程的环境变量
- 操作方法
- 使用信号实现优雅终止
- 操作方法
- 运行外部程序
第13章 网络编程
- TCP网络编程
- 编写TCP服务器
- 操作方法
- 原理说明
- 编写基于行的TCP服务器
- 操作方法
- 使用TCP连接发送/接收文件
- 操作方法
- 编写TCP客户端
- 操作方法
- 编写TLS客户端/服务器
- 操作方法
- 用于TLS终止和负载均衡的TCP代理
- 操作方法
- 设置读写截止时间
- 操作方法
- 解除阻塞的读写操作
- 操作方法
- 原理说明
- 编写TCP服务器
- 编写UDP客户端/服务器
- 操作方法
- 使用HTTP
- 发起HTTP调用
- 操作方法
- 运行HTTP服务器
- 操作方法
- HTTPS——设置TLS服务器
- 操作方法
- 编写HTTP处理器
- 操作方法
- 在文件系统上提供静态文件服务
- 操作方法
- 处理HTML表单
- 操作方法
- 编写用于下载大文件的处理器
- 操作方法
- 以流的方式处理HTTP上传的文件和表单
- 操作方法
- 发起HTTP调用
- TCP网络编程
第14章 流式输入/输出
- 读取器/写入器
- 从读取器读取数据
- 向写入器写入数据
- 从字节切片读取数据和向字节切片写入数据
- 从字符串读取数据和向字符串写入数据
- 文件操作
- 创建和打开文件
- 关闭文件
- 从文件读取数据/向文件写入数据
- 从特定位置读取/写入数据
- 更改文件大小
- 获取文件大小
- 处理二进制数据
- 操作方法
- 数据复制
- 复制文件
- 文件系统操作
- 处理文件名
- 创建临时目录和文件
- 读取目录
- 管道操作
- 将需要读取器的代码与需要写入器的代码连接起来
- 使用TeeReader拦截读取器
- 读取器/写入器
第15章 数据库操作
- 连接数据库
- 操作方法
- 运行SQL语句
- 不使用显式事务运行SQL语句
- 使用事务运行SQL语句
- 在事务中运行预编译语句
- 从查询中获取值
- 操作方法
- 动态构建SQL语句
- 构建UPDATE语句
- 操作方法
- 构建WHERE子句
- 操作方法
- 构建UPDATE语句
- 连接数据库
第16章 日志记录
- 使用标准日志记录器
- 写入日志消息
- 控制格式
- 更改日志输出位置
- 使用结构化日志记录器
- 使用全局日志记录器进行日志记录
- 使用不同级别写入结构化日志
- 在运行时更改日志级别
- 使用带有额外属性的日志记录器
- 更改日志输出位置
- 从上下文添加日志信息
- 使用标准日志记录器
第17章 测试、基准测试和性能分析
- 单元测试
- 编写单元测试
- 操作方法
- 运行单元测试
- 操作方法
- 测试中记录日志
- 操作方法
- 跳过测试
- 测试HTTP服务器
- 操作方法
- 测试HTTP处理器
- 操作方法
- 检查测试覆盖率
- 操作方法
- 编写单元测试
- 基准测试
- 编写基准测试
- 操作方法
- 编写具有不同输入大小的多个基准测试
- 运行基准测试
- 操作方法
- 编写基准测试
- 性能分析
- 操作方法
- 另请参阅
- 单元测试