Mastering_Go_ZH_CN
  • 介绍
  • [0 前言]
    • 00.1 前言
    • 00.2 面向读者
    • 00.3 章节概览
    • 00.4 更多信息
      • 00.4.1 代码规范约定
  • [1 Go与操作系统]
    • 01.1 本书结构
    • 01.2 Go的历史
    • 01.3 为什么是Go
    • 01.4 Go的优点
      • 01.4.1 Go是完美的么
  • [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
  • [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 本章小结
  • 4 组合类型的使用
    • 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 本章小结
  • 5 数据结构
    • 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 本章小结
  • 6 Go package中不为人知的知识
    • 06.1 关于Go packages
    • 06.2 Go函数
      • 06.2.1 匿名函数
      • 06.2.2 多返回值的函数
      • 06.2.3 可命名的函数返回值
      • 06.2.4 参数为指针的函数
      • 06.2.5 返回值为指针的函数
      • 06.2.6 闭包
      • 06.2.7 函数作为参数
    • 06.3 设计你的Go packages
  • [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 本章小结
  • 8 Go 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 总结
  • 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 本章小结
  • 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 本章小结
  • 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 本章小结
  • 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 本章小结
  • 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 本章小节
Powered by GitBook
On this page
  • Mastering_Go_ZH_CN
  • =======

Was this helpful?

介绍

Next[0 前言]

Last updated 3 years ago

Was this helpful?

本书已翻译完成,欢迎阅读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