README ¶ 本书已翻译完成,欢迎阅读GitBook,提出宝贵的修改意见😘。 在线阅读: Mastering_Go_ZH_CN PDF下载:移步release中下载PDF,离线阅读 英文第二版强势来袭!我们也在招募热爱学习的你,一起来玩转,第二版项目地址:https://github.com/hantmac/Mastering_Go_Second_Edition_Zh_CN Mastering_Go_ZH_CN 《Mastering GO》 交流社区 有兴趣的读者可关注公众号Go_Official_Blog 了解更多官方资讯。 本书适用于Golang程序员。您之前应该阅读有关Go的介绍性书籍,或者已经完成了Go By Example。本书的内容包括但不限于并发、网络编程、垃圾回收、组合、GO UNIX系统编程、基本数据类型(Array,Slice,Map)、GO源码、反射,接口,类型方法等高级概念。阅读本书需要一定的编程经验。如果你在工作中使用Go或者业余时间爱好GO,那么这本书一定会让你对GO的理解更上一层楼。 翻译进度 持续更新中。。。。 目录 chapter 0 前言 00.1 前言 00.2 面向读者 00.3 章节概览 00.4 更多信息 00.4.1 代码规范约定 chapter 1 Go与操作系统 01.1 本书结构 01.2 Go的历史 01.3 为什么是Go 01.4 Go的优点 01.4.1 Go是完美的么 chapter 2 Go内部机制 02.1 本章概述 02.2 编译器 02.3 垃圾回收 02.3.1 三色算法 02.3.2 垃圾回收器背后的更多操作 02.3.3 Unsafe code 02.3.4 关于unsafe包 02.3.5 另一个usafe包的例子 02.5 C中调用Go函数 02.5.1 Go Package 02.5.2 C代码 02.6 defer关键字 02.7 Panic和Recover chapter 3 Go基本数据类型 03.1 Go循环 03.1.1 for循环 03.1.2 while循环 03.1.3 range关键字 03.1.4 for循环代码示例 03.3 Go切片 03.3.1 切片基本操作 03.3.2 切片的扩容 03.3.3 字节切片 03.3.4 copy()函数 03.3.5 多维切片 03.3.6 使用切片的代码示例 03.3.7 使用sort.Slice()排序 03.4 Go 映射(map) 03.4.1 Map值为nil的坑 03.4.2 何时该使用Map? 03.5 Go 常量 03.5.1 常量生成器:iota 03.6 Go 指针 03.7 时间与日期的处理技巧 03.7.1 解析时间 03.7.2 解析时间的代码示例 03.7.3 解析日期 03.7.4 解析日期的代码示例 03.7.5 格式化时间与日期 03.8 延展阅读 03.9 练习 03.10 本章小结 chapter4 组合类型的使用 04.1 关于组合类型 04.2 结构体 04.2.1 结构体指针 04.2.2 使用new关键字 04.3 元组 04.4 正则表达式与模式匹配 04.4.1 理论知识 04.4.2 简单的正则表达式示例 04.4.3 高级的正则表达式示例 04.4.4 正则匹配IPv4地址 04.5 字符串 04.5.1 rune是什么? 04.5.2 关于Unicode的包 04.5.3 关于字符串处理的包 04.6 switch语句 04.7 计算Pi的精确值 04.8 实现简单的K-V存储 04.9 延展阅读 04.10 练习 04.11 本章小结 chapter5 数据结构 05.1 图和节点 05.2 算法复杂度 05.3 Go 语言中的二叉树 05.3.1 Go 语言实现二叉树 05.3.2 二叉树的优点 05.4 Go 语言中的哈希表 05.4.1 Go 语言实现哈希表 05.4.2 实现查找功能 05.4.3 哈希表的优点 05.5 Go 语言中的链表 05.5.1 Go 语言实现链表 05.5.2 链表的优点 05.6 Go 语言中的双向链表 05.6.1 Go 语言实现双向链表 05.6.2 双向链表的优点 05.7 Go 语言中的队列 05.7.1 Go 语言实现队列 05.8 Go 语言中的栈 05.8.1 Go 语言实现栈 05.9 container 包 05.9.1 使用 container/heap 05.9.2 使用 container/list 05.9.3 使用 container/ring 05.10 生成随机数 05.10.1 生成随机字符串 05.11 延展阅读 05.12 练习 05.13 本章小结 chapter 6 Go package中不为人知的知识 chapter 6.1 关于Go packages chapter 6.2 Go函数 chapter 6.2.1 匿名函数 chapter 6.2.2 多返回值的函数 chapter 6.2.3 可命名的函数返回值 chapter 6.2.4 参数为指针的函数 chapter 6.2.5 返回值为指针的函数 chapter 6.2.6 闭包 chapter 6.2.7 函数作为参数 chapter 6.3 设计你的Go packages chapter 7 反射和接口 07.1 类型方法 07.2 Go的接口 07.3 类型断言 07.4 设计接口 07.4.1 接口的使用 07.4.2 Switch用于类型判断 07.5 反射 07.5.1 使用反射的简单示例 07.5.2 反射进阶 07.5.3 反射的三个缺点 07.6 Go的OOP思想 07.7 延展阅读 07.8 练习 07.9 本章小结 chapter 8 Unix系统操作 08.1 关于Unix进程 08.2 flag包 08.3 io.Reader和io.Writer接口 08.3.1 缓冲和无缓冲的文件输入和输出 08.4 bufio包 08.5 读取文本文件 08.5.1 逐行读取文本文件 08.5.2 逐词读取文本文件 08.5.3 逐字符读取文本文件 08.5.4 从/dev/random中读取 08.6 从文件中读取所需的数据量 08.7 为什么我们使用二进制格式 08.8 读取CSV文件 08.9 写入文件 08.10 从磁盘加载和保存数据 08.11 再看strings包 08.12 关于bytes包 08.13 文件权限 08.14 处理Unix信号 08.14.1 处理两种信号 08.14.2 处理所有信号 08.15 Unix管道编程 08.16 遍历目录树 08.17 使用ePBF 08.18 关于syscall.PtraceRegs 08.19 跟踪系统调用 08.20 User ID和group ID 08.21 其他资源 08.22 练习 08.23 总结 chapter 9 并发-Goroutines,Channel和Pipeline 09.1 关于进程,线程和Go协程 09.1.1 Go调度器 09.1.2 并发与并行 09.2 Goroutines 09.2.1 创建一个Goroutine 09.2.2 创建多个Goroutine 09.3 优雅地结束goroutines 09.3.1 当Add()和Done()的数量不匹配时会发生什么? 09.4 Channel(通道) 09.4.1 通道的写入 09.4.2 从通道接收数据 09.4.3 通道作为函数参数传递 09.5 管道 09.6 延展阅读 09.7 练习 09.8 本章小结 chapter 10 Go 并发-进阶讨论 10.1 重温调度器 10.1.1 环境变量 GOMAXPROCS 10.2 select关键字 10.3 goroutine超时检查的两种方式 10.3.1 方式1 10.3.2 方式2 10.4 重温Channel(通道) 10.4.1 信号通道 10.4.2 可缓冲通道 10.4.3 值为nil的通道 10.4.4 传送channel的通道 10.4.5 指定通道的执行顺序 10.5 通过共享变量来共享内存 10.5.1 sync.Mutex 类型 10.5.1.1 忘记解锁mutex的后果 10.5.2 sync.RWMutex类型 10.5.3 通过goroutine共享内存 10.6 竞争状态 10.7 关于context包 10.7.1 context使用的高级示例 10.7.2 工作池 10.8 延展阅读 10.9 练习 10.10 本章小结 chapter 11 代码测试,优化以及分析 11.1 本章使用的Go版本 11.1.1 1.10和1.9的版本对比 11.2 安装beta或者RC版本 11.3 关于优化 11.4 优化你的Go代码 11.5 分析Go代码 11.5.1 标准库net/http/pprof 11.5.2 代码分析示例 11.5.3 用于分析的第三方包 11.5.4 Go分析器的web接口 11.5.4.1 使用web接口的分析示例 11.5.4.2 Graphviz快览 11.6 go tool的代码追踪 11.7 测试 11.7.1 编程测试代码 11.8 基准测试 11.8.1 基准测试示例 11.8.2 错误的基准测试函数 11.9 基准测试的缓冲写入 11.10 揪出隐藏的代码 11.11 交叉编译 11.12 创建示例函数 11.13 生成文档 11.14 延展阅读 11.15 练习 11.16 本章小结 chapter 12 Go网络编程基础 12.1 关于net/http,net和http.RoundTripper 12.1.1 http.Response类型 12.1.2 http.Request类型 12.1.3 http.Transport类型 12.2 关于TCP/IP 12.3 关于IPv4和IPv6 12.4 命令行工具netcat 12.5 读取网络接口的配置文件 12.6 实现DNS查询 12.6.1 获取域名的 NS 记录 12.6.2 获取域名的 MX 记录 12.7 Go实现web服务器 12.7.1 分析HTTP服务 12.7.2 用Go创建网站 12.8 追踪 HTTP 12.8.1 测试 HTTP handler 12.9 Go实现web客户端 12.9.1 Go web客户端进阶 12.10 HTTP连接超时 12.10.1 SetDeadline 介绍 12.10.2 服务端设置超时时间 12.10.3 设置超时的另外一种方法 12.11 抓包工具Wireshark和tshark 12.12 延展阅读 12.13 练习 12.14 本章小结 chapter 13 网络编程 - 构建服务器与客户端 13.1 Go 标准库-net 13.2 TCP 客户端 13.2.1 另一个版本的 TCP 客户端 13.3 TCP 服务器 13.3.1 另一个版本的 TCP 服务器 13.4 UDP 客户端 13.5 UDP 服务器 13.6 并发 TCP 服务器 13.6.1 简洁的并发TCP服务器 13.7 远程调用(RPC) 13.7.1 RPC 客户端 13.7.2 RPC 服务器 13.8 底层网络编程 13.8.1 获取ICMP数据 13.9 接下来的任务 13.10 延展阅读 13.11 练习 13.12 本章小结 ======= 支持本书 如果你喜欢本书 《玩转 Go》,你可以参与到本书的翻译或纠正工作中来,具体请联系【Jack E-mail:hantmac@outlook.com】,一同完善本书并帮助壮大 Go 语言在国内的学习群体,给大家提供更好的学习资源。 规则&&Fork&&PR 章节命名规则:举例,第一章第一节,01.1.md,如果第一节下面还有分支,01.1.1,依次类推; 联系邮箱,取得电子版,获得安排的翻译章节,Fork分支,提交PR; 由多人审核后,合并 致谢 本书原作者:Mihalis Tsoukalos 参与翻译人员 Jeremy xionghui leeweir songxuexian tangjun1990 glbrtchen wskdsgcf mark1995 themoonbear klew foxxnuaa luobangkui 授权许可 除特别声明外,本书中的内容使用 CC BY-SA 3.0 License(创作共用 署名-相同方式共享3.0 许可协议)授权,代码遵循 BSD 3-Clause License(3 项条款的 BSD 许可协议)。 开始阅读 Go学习资料及社区(持续更新中。。。) Go By Example 英文网站 Go By Example 中文网站 GOCN Forum Go语言中文网 Go walker 强大的Go在线API文档 jsonTOGo 好用的json转go struct工具 Go web框架beego 官方代码规范指导 xorm支持 MySQL、PostgreSQL、SQLite3 以及 MsSQL mgoMongoDB 官方推荐驱动 gorm全功能 ORM (无限接近) 支持 MySQL、PostgreSQL、SQLite3 以及 MsSQL Expand ▾ Collapse ▴ Directories ¶ Show internal Expand all Path Synopsis eBook examples/chapter12 examples/chapter3 examples/chapter4 examples/chapter5 examples/chapter8 examples/chapter9 Click to show internal directories. Click to hide internal directories.