Go系统接口编程 前言
# Go系统接口编程 前言
系统编程是软件工程领域的关键知识板块。对于那些想要编写高效底层代码并与操作系统紧密交互的专业人士而言,它尤为重要。《Go系统接口编程》旨在引领你掌握运用Go语言进行系统编程所需的原理与实践。本书涵盖广泛的主题,从基础系统编程概念到高级技术,为应对现实世界中的系统编程挑战提供了一套全面的工具集。
本书翻译自《System Programming Essentials with Go》。
限于水平有限,如果您在阅读过程中有任何问题,可以联系小方(微信cppxiaofang),也欢迎加入小方的 技术交流群,群里面有很多开发高手,不定期发布招聘信息,加群请备注“加微信群”。
小方微信公众号【CppGuide】:
# 本书受众
本书专为具备基础编程知识,且渴望深化系统设计知识的软件工程师、架构师和开发者量身打造。对于那些在工作中面临复杂设计问题,或单纯希望提升底层编程技能的人来说,它是理想的读物。阅读本书需要具备编程概念的基础知识以及至少一种编程语言的使用经验。
# 本书内容
- 第1章“为什么选择Go语言?”概述了Go语言在构建高效、高性能系统软件方面的适用性,帮助你掌握利用Go语言进行系统级开发的知识和技能。本章涵盖Go语言的并发模型、网络与I/O、底层控制、系统调用、跨平台支持以及工具等内容,并提供实际见解和示例,助力构建健壮的系统程序。
- 第2章“重温并发与并行”概述了Go编程语言中Goroutine、数据竞争、通道的核心内容,以及它们之间的相互作用。理解这些原理对于实现高效并发、管理共享资源以及确保Goroutine之间有效通信至关重要。
- 第3章“理解系统调用”概述了系统调用及其实际应用。你将学习如何创建符号链接、删除文件以及操作文件名路径。此外,你还将更深入地了解Go语言中的
os
和syscall
包,并学习如何开发和测试命令行界面(CLI)程序。 - 第4章“文件和目录操作”介绍了在Go语言中处理文件系统的相关知识,重点讲解检测不安全权限、计算目录大小以及识别重复文件。
- 第5章“处理系统事件”深入探讨了如何使用Go语言构建高级且高效的系统工具,重点关注任务调度、文件监控、进程管理和分布式锁。
- 第6章“理解进程间通信中的管道”探讨了进程间通信(IPC)中管道的概念。它全面介绍了匿名管道、命名管道(mkfifo),以及管道与其他程序的交互方式。
- 第7章“Unix套接字”帮助你理解UNIX套接字的工作原理、类型,以及它们在UNIX和类UNIX操作系统(如Linux)的进程间通信中所扮演的角色。
- 第8章“内存管理”聚焦于垃圾回收的机制和策略。我们将探讨Go语言垃圾回收的发展历程、栈内存和堆内存分配的区别,以及高效内存管理的高级技术。
- 第9章“性能分析”介绍了Go应用程序的关键优化技术,包括逃逸分析、基准测试、CPU性能分析和内存性能分析。它解释了如何通过逃逸分析改善内存使用情况,如何通过基准测试衡量和比较代码性能,如何通过CPU性能分析确定热点代码,以及如何使用内存性能分析检测内存泄漏。
- 第10章“网络编程”深入探索了Go网络编程的奇妙世界。网络编程是系统编程的重要组成部分,Go语言提供了强大的原语来处理网络通信。通过探索TCP、HTTP和其他相关协议,你将获得创建健壮网络应用程序所需的专业知识。
- 第11章“遥测技术”深入探讨了如何利用行业工具实施有效的遥测实践。从日志到跟踪和指标,你将探索高效监控应用程序所需的工具和指南。
- 第12章“分发你的应用程序”探讨了使用Go模块、持续集成和发布策略分发应用程序的关键概念和实际应用。
- 第13章“综合项目——分布式缓存”指导你完成综合项目。该项目将使用Go语言构建一个具有Memcached或Redis等特性的分布式缓存系统。它将涵盖分片策略、逐出策略、一致性模型和技术选型等内容,同时分析每个决策所带来的权衡。
- 第14章“高效编码实践”探讨了Go编程中高效资源管理的原则和技术,特别关注如何避免可能导致性能问题并影响整体效率的常见陷阱。它深入研究了如何使用Go标准库优化资源使用的细节,为希望提高Go应用程序效率的开发者提供策略。
- 第15章“在系统编程中保持敏锐”基于实际案例研究,为基于Go语言的系统编程提供了持续学习的路径。通过了解Go语言在实际应用中的使用方法,你可以将这些经验应用到自己的项目中。
- 附录“硬件自动化”探讨了如何利用各种工具实现USB驱动器和蓝牙设备的日常任务自动化,并监控外围设备事件。了解如何实现这些过程的自动化,将帮助你节省宝贵时间并提高日常生活中的工作效率。
# 要求
你需要具备Golang的基础知识。
软件 | 操作系统要求 |
---|---|
Golang(1.16及以上版本) | Windows、macOS或Linux(推荐使用Linux) |
# 详细目录
前言
# 第一部分:引言
第1章 为什么选择Go语言?
- 选择Go语言的原因
- 并发与goroutine
- 并发
- goroutine
- 受通信顺序进程(CSP)启发的模型
- 通过通信共享数据
- 与操作系统交互
- 工具
- go build
- go test
- go run
- go vet
- go fmt
- 使用Go进行跨平台开发
- 总结 第2章 重温并发与并行
- 技术要求
- 理解goroutine
- 等待组(WaitGroup)
- 更改共享状态
- 管理数据竞争
- 原子操作
- 互斥锁(Mutexes)
- 理解通道(channels)
- 如何使用通道
- 无缓冲通道
- 有缓冲通道
- 交付保证
- 延迟
- 状态与信号传递
- 状态
- 信号传递
- 选择同步机制
- 总结
# 第二部分:与操作系统交互
第3章 理解系统调用
- 技术要求
- 系统调用简介
- 服务目录与标识
- 信息交换
- syscall包
- 深入探究os和x/sys包
- x/sys包——底层系统调用
- 操作系统功能
- 可移植性
- 日常系统调用
- 跟踪系统调用
- 跟踪特定系统调用
- 开发和测试命令行界面(CLI)程序
- 标准流
- 文件描述符
- 创建CLI应用程序
- 重定向与标准流
- 使其可测试
- 总结
第4章 文件和目录操作
- 技术要求
- 识别不安全的文件和目录权限
- 符号链接与删除文件
- 符号链接——文件世界的快捷方式
- 删除文件——“大逃亡”行为
- 文件与权限
- 计算目录大小
- 在Go中扫描目录
- 查找重复文件
- 理解文件路径
- 优化文件系统操作
- 使用path/filepath包
- 遍历目录
- 总结
第5章 处理系统事件
- 管理系统事件
- 什么是信号?
- os/signal包
- Go中的任务调度
- 为什么要调度?
- 基本调度
- 处理定时器信号
- 文件监控
- Inotify
- fsnotify
- 文件轮转
- 进程管理
- 执行与超时
- 执行并控制进程执行时间
- 使用Go构建分布式锁管理器
- 总结
第6章 理解进程间通信中的管道
- 技术要求
- 进程间通信中的管道是什么?
- 管道为何重要?
- Go语言中的管道
- 匿名管道的原理
- 探索命名管道(Mkfifo())
- 使用管道的最佳实践——指南
- 高效的数据处理
- 错误处理与资源管理
- 安全考量
- 性能优化
- 开发日志处理工具
- 总结
第7章 Unix套接字
- Unix套接字简介
- 创建Unix套接字
- 深入探究套接字创建
- 创建客户端
- 使用lsof检查套接字
- 构建聊天服务器
- 完整的聊天客户端
- 在UNIX域套接字下提供HTTP服务
- 客户端
- HTTP请求行
- HTTP请求头
- 表示头信息结束的空行
- textproto包
- 性能
- 其他常见用例
- 总结
# 第三部分:性能
第8章 内存管理
- 技术要求
- 垃圾回收
- 栈和堆分配
- GC算法
- GOGC
- GC调优器
- GODEBUG
- 内存压载
- GOMEMLIMIT
- 内存竞技场
- 使用内存竞技场
- 总结 第9章 性能分析
- 逃逸分析
- 栈和指针
- 栈
- 堆
- 指针
- 如何进行分析?
- 基准测试代码
- 编写你的第一个基准测试
- 内存分配
- 常见陷阱
- CPU性能分析
- 内存性能分析
- 随时间分析内存使用情况
- 准备探索权衡
- 总结
# 第四部分:连接的应用程序
第10章 网络编程 - net包 - TCP套接字 - HTTP服务器和客户端 - HTTP动词 - HTTP状态码 - 整合所有内容 - 保护连接 - 证书 - 高级网络编程 - UDP与TCP对比 - 总结 第11章 遥测技术 - 技术要求 - 日志 - Zap与slog对比 - 用于调试还是监控的日志记录? - 记录什么? - 不记录什么? - 跟踪 - 有效跟踪 - 分布式跟踪 - 指标 - 我们应该使用什么指标? - OTel项目 - OTel - 总结 第12章 分发你的应用程序 - 技术要求 - Go模块 - 使用模块的常规操作 - 持续集成(CI) - 缓存 - 静态分析 - 发布你的应用程序 - 总结
# 第五部分:深入拓展
第13章 综合项目——分布式缓存 - 技术要求 - 理解分布式缓存 - 系统要求 - 需求 - 设计与权衡 - 创建项目 - 线程安全 - 选择正确的方法 - 添加线程安全性 - 接口 - TCP - HTTP - 其他 - 逐出策略 - 分片 - 总结 第14章 高效编码实践 - 技术要求 - 重用资源 - 在网络服务器中使用sync.Pool - 用于JSON编组的sync.Pool - 执行一次性任务 - singleflight - 高效内存映射 - 高级用法:保护和映射标志 - API使用 - 避免常见性能陷阱 - time.After导致的内存泄漏 - for循环中的defer - 映射管理 - 资源管理 - 处理HTTP请求体 - 通道管理不当 - 总结 第15章 在系统编程中保持敏锐 - 实际应用 - Dropbox的大胆尝试 - HashiCorp——从一开始就使用Go语言 - Grafana Labs——用Go实现可视化成功 - Docker——用Go掀起容器革命 - SoundCloud——从Ruby转向Go - 探索系统编程领域 - Go版本发布说明和博客 - 社区 - 贡献 - 实践尝试 - 持续学习的资源 - 你的系统编程之旅