目录
第一部分:学习 Go 语言
第二部分:语言的核心结构与技术
第三部分:Go 高级编程
第四部分:实际应用
附录
索引
前言
用更少的代码,更短的编译时间,创建运行更快的程序,享受更多的乐趣
链接
1.1 起源与发展
时间轴:
链接
1.2 语言的主要特性与发展的环境和影响因素
1.2.1 影响 Go 语言发展的早期编程语言
1.2.2 为什么要创造一门编程语言
1.2.3 Go 语言的发展目标
1.2.4 指导设计原则
1.2.5 语言的特性
1.2.6 语言的用途
1.2.7 关于特性缺失
1.2.8 使用 Go 语言编程
1.2.9 小结
链接
2.1 平台与架构
链接
2.2 Go 环境变量
链接
2.3 在 Linux 上安装 Go
链接
2.4 在 Mac OS X 上安装 Go
链接
2.5 在 Windows 上安装 Go
链接
2.6 安装目录清单
链接
2.7 Go 运行时(runtime)
链接
2.8 Go 解释器
链接
3.0 编辑器、集成开发环境与其它工具
链接
3.1 Go 开发环境的基本要求
链接
3.2 编辑器和集成开发环境
3.2.1 LiteIDE
3.2.2 GoClipse
链接
3.3 调试器
链接
3.4 构建并运行 Go 程序
链接
3.5 格式化代码
链接
3.6 生成代码文档
链接
3.7 其它工具
链接
3.8 Go 性能说明
链接
3.9 与其它语言进行交互
3.9.1 与 C 进行交互
3.9.2 与 C++ 进行交互
链接
4.1 文件名、关键字与标识符
链接
4.2 Go 程序的基本结构和要素
4.2.1 包的概念、导入与可见性
4.2.2 函数
4.2.3 注释
4.2.4 类型
4.2.5 Go 程序的一般结构
4.2.6 类型转换
4.2.7 Go 命名规范
链接
4.3 常量
链接
4.4 变量
4.4.1 简介
4.4.2 值类型和引用类型
4.4.3 打印
4.4.4 简短形式,使用 := 赋值操作符
4.4.5 init 函数
链接
4.5 基本类型和运算符
4.5.1 布尔类型 bool
4.5.2 数字类型
4.5.2.1 整型 int 和浮点型 float
4.5.2.2 复数
4.5.2.3 位运算
4.5.2.4 逻辑运算符
4.5.2.5 算术运算符
4.5.2.6 随机数
4.5.3 运算符与优先级
4.5.4 类型别名
4.5.5 字符类型
链接
4.6 字符串
链接
4.7 strings 和 strconv 包
4.7.1 前缀和后缀
4.7.2 字符串包含关系
4.7.3 判断子字符串或字符在父字符串中出现的位置(索引)
4.7.4 字符串替换
4.7.5 统计字符串出现次数
4.7.6 重复字符串
4.7.7 修改字符串大小写
4.7.8 修剪字符串
4.7.9 分割字符串
4.7.10 拼接 slice 到字符串
4.7.11 从字符串中读取内容
4.7.12 字符串与其它类型的转换
链接
4.8 时间和日期
链接
4.9 指针
链接
5.0 控制结构
链接
5.1 if-else 结构
链接
5.2 测试多返回值函数的错误
链接
5.3 switch 结构
链接
5.4 for 结构
5.4.1 基于计数器的迭代
练习题
5.4.2 基于条件判断的迭代
5.4.3 无限循环
5.4.4 for-range 结构
链接
5.5 Break 与 continue
链接
5.6 标签与 goto
链接
6.0 函数
链接
6.1 介绍
链接
6.2 函数参数与返回值
6.2.1 按值传递(call by value) 按引用传递(call by reference)
6.2.2 命名的返回值(named return variables)
6.2.3 空白符(blank identifier)
6.2.4 改变外部变量(outside variable)
链接
6.3 传递变长参数
链接
6.4 defer 和追踪
链接
6.5 内置函数
链接
6.6 递归函数
练习题
链接
6.7 将函数作为参数
链接
6.8 闭包
链接
6.9 应用闭包:将函数作为返回值
链接
6.10 使用闭包调试
链接
6.11 计算函数执行时间
链接
6.12 通过内存缓存来提升性能
链接
7.0 数组与切片
链接
7.1 声明和初始化
7.1.1 概念
7.1.2 数组常量
7.1.3 多维数组
7.1.4 将数组传递给函数
链接
7.2 切片
7.2.1 概念
7.2.2 将切片传递给函数
7.2.3 用 make() 创建一个切片
7.2.4 new() 和 make() 的区别
7.2.5 多维 切片
7.2.6 bytes 包
链接
7.3 For-range 结构
链接
7.4 切片重组(reslice)
链接
7.5 切片的复制与追加
链接
7.6 字符串、数组和切片的应用
7.6.1 从字符串生成字节切片
7.6.2 获取字符串的某一部分
7.6.3 字符串和切片的内存结构
7.6.4 修改字符串中的某个字符
7.6.5 字节数组对比函数
7.6.6 搜索及排序切片和数组
7.6.7 append 函数常见操作
7.6.8 切片和垃圾回收
链接
8.0 Map
链接
8.1 声明、初始化和 make
8.1.1 概念
8.1.2 map 容量
8.1.3 用切片作为 map 的值
链接
8.2 测试键值对是否存在及删除元素
链接
8.3 for-range 的配套用法
链接
8.4 map 类型的切片
链接
8.5 map 的排序
链接
8.6 将 map 的键值对调
链接
9.0 包(package)
链接
9.1 标准库概述
链接
9.2 regexp 包
链接
9.3 锁和 sync 包
链接
9.4 精密计算和 big 包
链接
9.5 自定义包和可见性
链接
9.6 为自定义包使用 godoc
链接
9.7 使用 go install 安装自定义包
链接
9.8 自定义包的目录结构、go install 和 go test
9.8.1 自定义包的目录结构
9.8.2 本地安装包
9.8.3 依赖系统的代码
链接
9.9 通过 Git 打包和安装
9.9.1 安装到 GitHub
9.9.2 从 GitHub 安装
链接
9.10 Go 的外部包和项目
链接
9.11 在 Go 程序中使用外部库
链接
10 结构(struct)与方法(method)
链接
10.1 结构体定义
链接
10.2 使用工厂方法创建结构体实例
10.2.1 结构体工厂
10.2.2 map 和 struct vs new() 和 make()
链接
10.3 使用自定义包中的结构体
链接
10.4 带标签的结构体
链接
10.5 匿名字段和内嵌结构体
10.5.1 定义
10.5.2 内嵌结构体
10.5.3 命名冲突
链接
10.6 方法
10.6.1 方法是什么
10.6.2 函数和方法的区别
10.6.3 指针或值作为接收者
10.6.4 方法和未导出字段
10.6.5 内嵌类型的方法和继承
10.6.6 如何在类型中嵌入功能
10.6.7 多重继承
10.6.8 通用方法和方法命名
10.6.9 和其他面向对象语言比较 Go 的类型和方法
链接
10.7 类型的 String() 方法和格式化描述符
链接
10.8 垃圾回收和 SetFinalizer
链接
11 接口(Interfaces)与反射(reflection)
链接
11.1 接口是什么
链接
11.2 接口嵌套接口
链接
11.3 类型断言:如何检测和转换接口变量的类型
链接
11.4 类型判断:type-switch
链接
11.5 测试一个值是否实现了某个接口
链接
11.6 使用方法集与接口
链接
11.7 第一个例子:使用 Sorter 接口排序
链接
11.8 第二个例子:读和写
链接
11.9 空接口
11.9.1 概念
11.9.2 构建通用类型或包含不同类型变量的数组
11.9.3 复制数据切片至空接口切片
11.9.4 通用类型的节点数据结构
11.9.5 接口到接口
链接
11.10 反射包
11.10.1 方法和类型的反射
11.10.2 通过反射修改(设置)值
11.10.3 反射结构
链接
11.11 Printf 和反射
链接
11.12 接口与动态类型
11.12.1 Go 的动态类型
11.12.2 动态方法调用
11.12.3 接口的提取
11.12.4 显式地指明类型实现了某个接口
11.12.5 空接口和函数重载
11.12.6 接口的继承
链接
11.13 总结:Go 中的面向对象
链接
11.14 结构体、集合和高阶函数
链接
12 读写数据
链接
12.1 读取用户的输入
链接
12.2 文件读写
12.2.1 读文件
12.2.2 compress包:读取压缩文件
12.2.3 写文件
链接
12.3 文件拷贝
链接
12.4 从命令行读取参数
12.4.1 os 包
12.4.2 flag 包
链接
12.5 用 buffer 读取文件
链接
12.6 用切片读写文件
链接
12.7 用 defer 关闭文件
链接
12.8 使用接口的实际例子:fmt.Fprintf
链接
12.9 JSON 数据格式
反序列化:
解码任意的数据:
解码数据到结构
编码和解码流
链接
12.10 XML 数据格式
链接
12.11 用 Gob 传输数据
链接
12.12 Go 中的密码学
链接
13 错误处理与测试
链接
13.1 错误处理
13.1.1 定义错误
13.1.2 用 fmt 创建错误对象
链接
13.2 运行时异常和 panic
链接
13.3 从 panic 中恢复(Recover)
链接
13.4 自定义包中的错误处理和 panicking
链接
13.5 一种用闭包处理错误的模式
链接
13.6 启动外部命令和程序
链接
13.7 Go 中的单元测试和基准测试
链接
13.8 测试的具体例子
链接
13.9 用(测试数据)表驱动测试
链接
13.10 性能调试:分析并优化 Go 程序
13.10.1 时间和内存消耗
13.10.2 用 go test 调试
13.10.3 用 pprof 调试
链接
14 协程(goroutine)与通道(channel)
链接
14.1 并发、并行和协程
14.1.1 什么是协程
14.1.2 并发和并行的差异
14.1.3 使用 GOMAXPROCS
14.1.4 如何用命令行指定使用的核心数量
14.1.5 Go 协程(goroutines)和协程(coroutines)
链接
14.2 协程间的信道
14.2.1 概念
14.2.2 通信操作符 <-
14.2.3 通道阻塞
14.2.4 通过一个(或多个)通道交换数据进行协程同步。
14.2.5 同步通道-使用带缓冲的通道
14.2.6 协程中用通道输出结果
14.2.7 信号量模式
14.2.8 实现并行的 for 循环
14.2.9 用带缓冲通道实现一个信号量
14.2.10 给通道使用 for 循环
14.2.11 通道的方向
链接
14.3 协程的同步:关闭通道-测试阻塞的通道
链接
14.4 使用 select 切换协程
练习:
链接
14.5 通道、超时和计时器(Ticker)
链接
14.6 协程和恢复(recover)
链接
14.7 新旧模型对比:任务和worker
链接
14.8 惰性生成器的实现
链接
14.9 实现 Futures 模式
链接
15.0 网络,模板和网页应用
链接
15.1 tcp服务器
链接
15.2 一个简单的网页服务器
链接
15.3 访问并读取页面
链接
15.4 写一个简单的网页应用
16 常见的陷阱与错误
链接
16.1 误用短声明导致变量覆盖
链接
16.2 误用字符串
链接
16.3 发生错误时使用defer关闭一个文件
链接
16.4 何时使用new()和make()
链接
16.5 不需要将一个指向切片的指针传递给函数
链接
16.6 使用指针指向接口类型
链接
16.7 使用值类型时误用指针
链接
16.8 误用协程和通道
链接
16.9 闭包和协程的使用
链接
16.10 糟糕的错误处理
16.10.1 不要使用布尔值:
16.10.2 避免错误检测使代码变得混乱:
链接
17 模式
链接
17.1 关于逗号ok模式
链接
18 出于性能考虑的实用代码片段
链接
18.1 字符串
链接
18.2 数组和切片
链接
18.3 映射
链接
18.4 结构体
链接
18.5 接口
链接
18.6 函数
链接
18.7 文件
链接
18.8 协程(goroutine)与通道(channel)
链接
18.9 网络和网页应用
18.9.1 模板:
链接
18.10 其他
链接
18.11 出于性能考虑的最佳实践和建议
链接
关于本文·16.10.2小结糟糕错误处理的一些见解
关于16.10.2的第一个代码示例
关于16.10.2的第二个代码示例
关于错误处理的一些延伸