Go语言从入门到进阶实战(视频教学版) | PDF下载|ePub下载
类别: 计算机
作者:[美] Gayle Laakmann McDowell
出版社: 人民邮电出版社
原作名: Cracking the coding interview:150 programming questions and solutions,fifth edition
译者:李琳骁/漆犇
出版年: 2013-11
页数: 372
定价: 59.00元
装帧: 平装
ISBN: 9787115332912
出版社: 人民邮电出版社
原作名: Cracking the coding interview:150 programming questions and solutions,fifth edition
译者:李琳骁/漆犇
出版年: 2013-11
页数: 372
定价: 59.00元
装帧: 平装
ISBN: 9787115332912
内容简介 · · · · · ·
本书采用“理论+实例”的形式编写,通过大量的实例,结合作者多年的一线开发实战经验,全面介绍了Go语言的语法及使用方法。全书秉承方便学习,易于理解,便于查询的理念,无论是想系统学习Go语言基础知识的初学者,还是想进阶提高的有经验的开发人员,都能通过本书迅速掌握Go语言的各种基础语法和开发技巧。本书作者曾经与慕课网合作录制相关的视频课程,拥有丰富的视频制作经验,所以特意为本书精心录制了详细的配套教学视频,这将极大地提升读者的学习效率,比同类图书取得更好的学习效果。另外,本书还免费提供了书中所有实例源程序,为读者的学习提供便利。
作者简介 · · · · · ·
徐波 游戏行业从业十余年,资深全栈游戏开发者,慕课网讲师,开源爱好者(github.com/davyxu),众多Gopher之一。2009年创立“战魂小筑博客”,自2012年开始接触Go语言,开源项目cellnet以及tabtoy导表工具,深受业内好评,并广为流传。
目录 · · · · · ·
配套学习资源
前言
第1章 初识Go语言
1.1 Go语言特性
1.2 使用Go的开源项目
1.3 学会安装Go
1.3.1 Windows版安装
1.3.2 Linux版安装
1.4 搭建开发环境
1.4.1 集成开发环境Jetbrains Goland
1.4.2 方便定义功能的编辑器Visual Studio Code
第2章 基本语法与使用
2.1 变量
2.1.1 声明变量
2.1.2 初始化变量
2.1.3 多个变量同时赋值
2.1.4 匿名变量 ——没有名字的变量
2.2 类型
2.2.1 整形
2.2.2 浮点——小数点
2.2.3 示例:输出正弦(sin)图像
2.2.4 布尔——是或否
2.2.5 字符串
2.2.6 字符
2.2.7 切片——能动态分配的空间
2.3 转换不同的数据类型
2.4 指针
2.4.1 认识指针地址和指针类型
2.4.2 从指针获取指针指向的值
2.4.3 使用指针修改值
2.4.4 示例:使用指针变量获取命令行的输入信息
2.4.5 创建指针的另一种方法——new函数
2.5 变量生命期
2.5.1 什么是栈?
2.5.2 什么是堆?
2.5.3 变量逃逸分析(Escape Analysis)——自动决定变量分配位置,提高运行效率
2.6 字符串应用
2.6.1 计算字符串长度
2.6.2 遍历字符串——获取每一个字符串元素
2.6.3 获取字符串的某一段字符
2.6.4 修改字符串
2.6.5 连接字符串
2.6.6 格式化字符串——按照指定格式生成字符串
2.6.7 示例:Base64编码——电子邮件的基础编码格式
2.6.8 示例:从INI配置文件中查询需要的值
2.7 常量——恒定不会改变的值
2.7.2 枚举——一组常量值
2.7.3 将枚举值转换为字符串
2.8 类型别名(Type Alias)
2.8.1 区分类型别名与类型定义
2.8.2 非本地类型不能定义方法
2.8.3 在结构体成员嵌入时使用别名
第3章 容器:存储和组织数据的方式
3.1 数组——固定大小的连续空间
3.1.1 声明数组
3.1.2 初始化数组
3.1.3 遍历数组——访问每一个数组元素
3.2 切片(slice)——动态分配大小的连续空间
3.2.1 从数组或切片生成新的切片
3.2.2 声明切片
3.2.3 使用make构造切片
3.2.4 使用append为切片添加元素
3.2.5 复制切片元素到另一个切片
3.2.6 从切片中删除元素
3.3 映射(map)——建立事物关联的容器
3.3.1 添加关联到map并访问关联和数据
3.3.3 遍历map的“键值对”——访问每一个map中的关联关系
3.3.4 从map中删除键值对(delete)
3.3.5 清空map中的所有元素
3.3.6 能够在并发环境中使用的map——sync.Map
3.4 列表(list)——可以快速增删的非连续空间的容器
3.4.1 初始化列表
3.4.2 在列表中插入元素
3.4.3 从列表中删除元素
3.4.4 遍历列表——访问列表的每一个元素
第4章 流程控制
4.2 构建循环(for)
4.2.1 for中的初始语句——开始循环时执行的语句
4.2.2 for中的条件表达式——控制是否循环的开关
4.2.3 for中的结束语句——每次循环结束时执行的语句
4.3 示例: 九九乘法表
4.4 键值循环(for range)——直接获得对象的索引和数据
4.4.1 遍历数组、切片——获得索引和元素
4.4.2 遍历字符串——获得字符
4.4.3 遍历map——获得map的键和值
4.4.4 遍历通道(channel)——接收通道数据
4.4.5 在遍历中选择希望获得的变量
4.5 分支选择(switch)——拥有多个条件分支的判断
4.5.1 基本写法
4.5.2 跨越case的fallthrough——兼容C语言的case设计
4.6 跳转到指定代码标签(goto)
4.6.1 使用goto退出多层循环
4.6.2 使用goto集中处理错误
4.7 跳出指定循环(break)——可以跳出多层循环
4.8 继续下一次循环(continue)
第5章 函数(function)
5.1 声明函数
5.1.1 普通函数的声明形式
5.1.2 参数类型的简写
5.1.3 函数的返回值
5.1.4 调用函数
5.1.5 示例:将“秒”解析为时间单位
5.1.6 示例:函数中的参数传递效果测试
5.2 函数变量——把函数作为值保存到变量
5.3 示例:字符串的链式处理——操作与数据分离的设计技巧
5.4 匿名函数——没有函数名字的函数
5.4.1 定义一个匿名函数
5.4.1 匿名函数用作回调函数
5.4.2 使用匿名函数实现操作封装
5.5 函数类型实现接口——把函数当做接口调用
5.5.1 结构体实现接口
5.5.2 函数体实现接口
5.5.3 http包中的例子
5.6 闭包(Closure)——引用了外部变量的匿名函数
5.6.1 在闭包内部修改引用的变量
5.6.2 示例:闭包的记忆效应
5.6.3 示例:闭包实现生成器
5.7 可变参数——参数数量不固定的函数形式
5.7.1 fmt包中的例子
5.7.1 遍历可变参数列表——获取每一个参数的值
5.7.2 获得可变参数类型——获得每一个参数的类型
5.7.3 在多个可变参数函数中传递参数
5.8 延迟执行语句(defer)
5.8.1 多个延迟执行语句的处理顺序
5.8.1 使用延迟执行语句在函数退出时释放资源
5.9 处理运行时发生的错误
5.9.1 net包中例子
5.9.1 错误接口的定义格式
5.9.2 自定义一个错误
5.9.3 示例:在解析中使用自定义错误
5.10 宕机(panic)——程序终止运行
5.10.1 手动触发宕机
5.10.2 在运行依赖的必备资源缺失时主动触发宕机
5.10.3 在宕机时触发延迟执行语句
5.11 宕机恢复(recover)——防止程序崩溃
5.11.1 让程序在崩溃时继续执行
5.11.2 panic和recover的关系
第6章 结构体(struct)
6.1 定义结构体
6.2 实例化结构体——为结构体分配内存并初始化
6.2.1 基本的实例化形式
6.2.2 创建指针类型的结构体
6.2.3 取结构体的地址实例化
6.3 初始化结构体的成员变量
6.3.1 使用“键值对”初始化结构体
6.3.2 使用多个值的列表初始化结构体
6.3.3 初始化匿名结构体
6.4 构造函数——结构体和类型的一系列初始化操作的函数封装
6.4.1 多种方式创建和初始化结构体——模拟构造函数重载
6.4.2 带有父子关系的结构体的构造和初始化——模拟父级构造调用
6.5 方法
6.5.1 为结构体添加方法
6.5.2 接收器——方法作用的目标
6.5.3 示例:使用二维矢量模拟玩家移动
6.5.4 为类型添加方法
6.5.5 示例:使用事件系统实现事件的响应和处理
6.6 结构体内嵌
6.6.1 声明结构体内嵌和内嵌的特性
6.6.2 使用组合思想描述对象特性
6.6.3 初始化结构体内嵌
6.6.4 初始化内嵌匿名结构体
6.6.6 成员名字冲突
6.7 示例:使用匿名结构体分离JSON数据
第7章 接口(interface)
7.1 声明接口
7.1.1 接口声明的格式
7.1.2 开发中常见的接口及写法
7.1 实现接口的条件
7.1.1 接口被实现的条件一:接口的方法与实现接口的类型方法格式一致
7.1.2 条件二:接口中所有方法均被实现
7.2 理解类型与接口的关系
7.2.1 一个类型可以实现多个接口
7.2.2 多个类型可以实现相同的接口
7.3 示例:便于扩展输出方式的日志系统
7.4 示例:使用接口进行数据的排序
7.4.1 使用sort.Interface接口进行排序
7.4.2 常见类型的便捷排序
7.4.3 对结构体数据进行排序
7.5 接口的嵌套组合 ——将多个接口放在一个接口内
7.6 在接口和类型间转换
7.6.1 类型断言的格式
7.6.2 将接口转换为其他接口
7.6.3 将接口转换为其他类型
7.7 空接口类型(interface{})——能保存所有值的类型
7.7.1 将值保存到空接口
7.7.2 从空接口获取值
7.7.3 空接口间的值比较
7.8 示例:使用空接口实现可以保存任意值的字典
7.9 类型分支——批量判断空接口中变量的类型
7.9.1 类型断言的书写格式
7.9.2 使用类型分支判断基本类型
7.9.3 使用类型分支判断接口类型
7.10 示例:实现有限状态机(FSM)
第8章 包(package)
8.1 工作目录(GOPATH)
8.1.1 使用命令行查看GOPATH信息
8.1.2 使用GOPATH的工程结构
8.1.2 设置和使用GOPATH
8.1.3 在多项目工程中使用GOPATH
8.2 创建包(package)——编写自己的代码扩展
8.3 包在程序启动前的初始化入口:init
8.4 导出标示符——让外部访问包的类型和值
8.4.1 导出包内标示符
8.4.2 导出结构体及接口成员
8.5 导入包(import)——在代码中使用其他的代码
8.5.1 默认导入的写法
8.5.2 导入包后自定义引用的包名
8.5.2 匿名导入包——只导入包但不使用包内类型和数值
8.5.3 理解包导入初始化顺序
8.6 示例:工厂模式自动注册 ——管理多个包的结构体
第9章 并发
9.1 轻量级线程(goroutine)——根据需要随时创建的“线程”
9.1.1 使用普通函数创建goroutine
9.1.2 使用匿名函数创建goroutine
9.1.3 调整并发的运行性能(GOMAXPROCS)
9.1.4 理解并发和并行
9.1.5 理解Go的协作程序(goroutine)和普通的协作程序(coroutine)
9.2 通道(channel) ——在多个goroutine间通信的管道
9.2.1 通道的特性
9.2.2 声明通道类型
9.2.3 创建通道
9.2.4 使用通道发送数据
9.2.5 使用通道接收数据
9.2.6 关闭通道后继续使用通道
9.2.7 示例:并发打印
9.2.8 单向通道——通道中的单行道
9.2.9 带缓冲的通道——允许在通道中保存一定数量的数据
9.2.10 通道的多路复用——同时处理接收和发送多个通道的数据
9.2.11 示例:模拟远程过程调用(RPC)
9.2.12 示例:使用通道响应计时器的事件
9.3 示例:Telnet回音服务器——TCP服务器的基本结构
9.4 同步——保证并发环境下数据访问的正确性
9.4.1 竞态检测——检测代码在并发环境下可能出现的问题
9.4.2 互斥锁(sync.Mutex)——保证同时只有一个goroutine可以访问共享资源
9.4.3 读写互斥锁(sync.RWMutex)——在读比写多的环境下比互斥锁更高效
9.4.4 等待组(sync.WaitGroup)——保证在并发环境中完成指定数量的任务
第10章 反射
10.1 反射的类型对象(reflect.Type)
10.1.1 理解反射的类型(Type)与种类(Kind)
10.1.2 指针与指针指向的元素
10.1.3 使用反射获取结构体的成员类型
10.1.4 结构体标记(Struct Tag)——对结构体字段的额外信息标记
10.2 反射的值对象(reflect.Value)
10.2.1 使用反射值对象包装任意值
10.2.2 从反射值对象获取被包装的值
10.2.3 使用反射访问结构体的成员字段的值
10.2.4 判定反射的零值和空
10.2.5 使用反射值对象修改变量的值
10.2.6 通过类型创建类型的实例
10.2.7 使用反射调用函数
10.3 示例:将结构体的数据保存为JSON格式的文本数据
第11章 编译与工具
11.1 编译(go build)
11.1.1 go build无参数编译
11.1.2 go build + 文件列表
11.1.3 go build + 包
11.1.4 go build编译时的附加参数
11.2 编译后运行(go run)
11.3 编译并安装(go install)
11.2 一键获取代码、编译并安装(go get)
11.2.1 远程包的路径格式
11.2.2 go get + 远程包
11.2.3 go get使用时的附加参数
11.3 测试(go test)
11.3.1 单元测试——测试和验证代码的框架
11.3.2 基准测试——获得代码内存占用和运行效率的性能数据
11.4 性能分析(go pprof)——发现代码性能问题的调用位置
11.4.1 安装第三方图形化显式分析数据工具(Graphviz)
11.4.2 安装第三方性能分析分析代码包
11.4.3 性能分析代码
第12章 避坑与技巧
12.1 合理的使用并发特性
12.1.1 了解goroutine的生命期时再创建goroutine
12.1.2 避免在不必要的地方使用通道
12.2 反射:性能和灵活性的双刃剑
12.3 接口的nil判断
12.4 map的多键索引——多个数值条件可以同时查询
12.4.1 基于哈希值的多键索引及查询
12.4.2 利用map特性的多键索引及查询
12.4.3 总结
12.5 优雅的处理TCP粘包——一套完备的TCP协议的客户端和服务器框架
· · · · · ·
前言
第1章 初识Go语言
1.1 Go语言特性
1.2 使用Go的开源项目
1.3 学会安装Go
1.3.1 Windows版安装
1.3.2 Linux版安装
1.4 搭建开发环境
1.4.1 集成开发环境Jetbrains Goland
1.4.2 方便定义功能的编辑器Visual Studio Code
第2章 基本语法与使用
2.1 变量
2.1.1 声明变量
2.1.2 初始化变量
2.1.3 多个变量同时赋值
2.1.4 匿名变量 ——没有名字的变量
2.2 类型
2.2.1 整形
2.2.2 浮点——小数点
2.2.3 示例:输出正弦(sin)图像
2.2.4 布尔——是或否
2.2.5 字符串
2.2.6 字符
2.2.7 切片——能动态分配的空间
2.3 转换不同的数据类型
2.4 指针
2.4.1 认识指针地址和指针类型
2.4.2 从指针获取指针指向的值
2.4.3 使用指针修改值
2.4.4 示例:使用指针变量获取命令行的输入信息
2.4.5 创建指针的另一种方法——new函数
2.5 变量生命期
2.5.1 什么是栈?
2.5.2 什么是堆?
2.5.3 变量逃逸分析(Escape Analysis)——自动决定变量分配位置,提高运行效率
2.6 字符串应用
2.6.1 计算字符串长度
2.6.2 遍历字符串——获取每一个字符串元素
2.6.3 获取字符串的某一段字符
2.6.4 修改字符串
2.6.5 连接字符串
2.6.6 格式化字符串——按照指定格式生成字符串
2.6.7 示例:Base64编码——电子邮件的基础编码格式
2.6.8 示例:从INI配置文件中查询需要的值
2.7 常量——恒定不会改变的值
2.7.2 枚举——一组常量值
2.7.3 将枚举值转换为字符串
2.8 类型别名(Type Alias)
2.8.1 区分类型别名与类型定义
2.8.2 非本地类型不能定义方法
2.8.3 在结构体成员嵌入时使用别名
第3章 容器:存储和组织数据的方式
3.1 数组——固定大小的连续空间
3.1.1 声明数组
3.1.2 初始化数组
3.1.3 遍历数组——访问每一个数组元素
3.2 切片(slice)——动态分配大小的连续空间
3.2.1 从数组或切片生成新的切片
3.2.2 声明切片
3.2.3 使用make构造切片
3.2.4 使用append为切片添加元素
3.2.5 复制切片元素到另一个切片
3.2.6 从切片中删除元素
3.3 映射(map)——建立事物关联的容器
3.3.1 添加关联到map并访问关联和数据
3.3.3 遍历map的“键值对”——访问每一个map中的关联关系
3.3.4 从map中删除键值对(delete)
3.3.5 清空map中的所有元素
3.3.6 能够在并发环境中使用的map——sync.Map
3.4 列表(list)——可以快速增删的非连续空间的容器
3.4.1 初始化列表
3.4.2 在列表中插入元素
3.4.3 从列表中删除元素
3.4.4 遍历列表——访问列表的每一个元素
第4章 流程控制
4.2 构建循环(for)
4.2.1 for中的初始语句——开始循环时执行的语句
4.2.2 for中的条件表达式——控制是否循环的开关
4.2.3 for中的结束语句——每次循环结束时执行的语句
4.3 示例: 九九乘法表
4.4 键值循环(for range)——直接获得对象的索引和数据
4.4.1 遍历数组、切片——获得索引和元素
4.4.2 遍历字符串——获得字符
4.4.3 遍历map——获得map的键和值
4.4.4 遍历通道(channel)——接收通道数据
4.4.5 在遍历中选择希望获得的变量
4.5 分支选择(switch)——拥有多个条件分支的判断
4.5.1 基本写法
4.5.2 跨越case的fallthrough——兼容C语言的case设计
4.6 跳转到指定代码标签(goto)
4.6.1 使用goto退出多层循环
4.6.2 使用goto集中处理错误
4.7 跳出指定循环(break)——可以跳出多层循环
4.8 继续下一次循环(continue)
第5章 函数(function)
5.1 声明函数
5.1.1 普通函数的声明形式
5.1.2 参数类型的简写
5.1.3 函数的返回值
5.1.4 调用函数
5.1.5 示例:将“秒”解析为时间单位
5.1.6 示例:函数中的参数传递效果测试
5.2 函数变量——把函数作为值保存到变量
5.3 示例:字符串的链式处理——操作与数据分离的设计技巧
5.4 匿名函数——没有函数名字的函数
5.4.1 定义一个匿名函数
5.4.1 匿名函数用作回调函数
5.4.2 使用匿名函数实现操作封装
5.5 函数类型实现接口——把函数当做接口调用
5.5.1 结构体实现接口
5.5.2 函数体实现接口
5.5.3 http包中的例子
5.6 闭包(Closure)——引用了外部变量的匿名函数
5.6.1 在闭包内部修改引用的变量
5.6.2 示例:闭包的记忆效应
5.6.3 示例:闭包实现生成器
5.7 可变参数——参数数量不固定的函数形式
5.7.1 fmt包中的例子
5.7.1 遍历可变参数列表——获取每一个参数的值
5.7.2 获得可变参数类型——获得每一个参数的类型
5.7.3 在多个可变参数函数中传递参数
5.8 延迟执行语句(defer)
5.8.1 多个延迟执行语句的处理顺序
5.8.1 使用延迟执行语句在函数退出时释放资源
5.9 处理运行时发生的错误
5.9.1 net包中例子
5.9.1 错误接口的定义格式
5.9.2 自定义一个错误
5.9.3 示例:在解析中使用自定义错误
5.10 宕机(panic)——程序终止运行
5.10.1 手动触发宕机
5.10.2 在运行依赖的必备资源缺失时主动触发宕机
5.10.3 在宕机时触发延迟执行语句
5.11 宕机恢复(recover)——防止程序崩溃
5.11.1 让程序在崩溃时继续执行
5.11.2 panic和recover的关系
第6章 结构体(struct)
6.1 定义结构体
6.2 实例化结构体——为结构体分配内存并初始化
6.2.1 基本的实例化形式
6.2.2 创建指针类型的结构体
6.2.3 取结构体的地址实例化
6.3 初始化结构体的成员变量
6.3.1 使用“键值对”初始化结构体
6.3.2 使用多个值的列表初始化结构体
6.3.3 初始化匿名结构体
6.4 构造函数——结构体和类型的一系列初始化操作的函数封装
6.4.1 多种方式创建和初始化结构体——模拟构造函数重载
6.4.2 带有父子关系的结构体的构造和初始化——模拟父级构造调用
6.5 方法
6.5.1 为结构体添加方法
6.5.2 接收器——方法作用的目标
6.5.3 示例:使用二维矢量模拟玩家移动
6.5.4 为类型添加方法
6.5.5 示例:使用事件系统实现事件的响应和处理
6.6 结构体内嵌
6.6.1 声明结构体内嵌和内嵌的特性
6.6.2 使用组合思想描述对象特性
6.6.3 初始化结构体内嵌
6.6.4 初始化内嵌匿名结构体
6.6.6 成员名字冲突
6.7 示例:使用匿名结构体分离JSON数据
第7章 接口(interface)
7.1 声明接口
7.1.1 接口声明的格式
7.1.2 开发中常见的接口及写法
7.1 实现接口的条件
7.1.1 接口被实现的条件一:接口的方法与实现接口的类型方法格式一致
7.1.2 条件二:接口中所有方法均被实现
7.2 理解类型与接口的关系
7.2.1 一个类型可以实现多个接口
7.2.2 多个类型可以实现相同的接口
7.3 示例:便于扩展输出方式的日志系统
7.4 示例:使用接口进行数据的排序
7.4.1 使用sort.Interface接口进行排序
7.4.2 常见类型的便捷排序
7.4.3 对结构体数据进行排序
7.5 接口的嵌套组合 ——将多个接口放在一个接口内
7.6 在接口和类型间转换
7.6.1 类型断言的格式
7.6.2 将接口转换为其他接口
7.6.3 将接口转换为其他类型
7.7 空接口类型(interface{})——能保存所有值的类型
7.7.1 将值保存到空接口
7.7.2 从空接口获取值
7.7.3 空接口间的值比较
7.8 示例:使用空接口实现可以保存任意值的字典
7.9 类型分支——批量判断空接口中变量的类型
7.9.1 类型断言的书写格式
7.9.2 使用类型分支判断基本类型
7.9.3 使用类型分支判断接口类型
7.10 示例:实现有限状态机(FSM)
第8章 包(package)
8.1 工作目录(GOPATH)
8.1.1 使用命令行查看GOPATH信息
8.1.2 使用GOPATH的工程结构
8.1.2 设置和使用GOPATH
8.1.3 在多项目工程中使用GOPATH
8.2 创建包(package)——编写自己的代码扩展
8.3 包在程序启动前的初始化入口:init
8.4 导出标示符——让外部访问包的类型和值
8.4.1 导出包内标示符
8.4.2 导出结构体及接口成员
8.5 导入包(import)——在代码中使用其他的代码
8.5.1 默认导入的写法
8.5.2 导入包后自定义引用的包名
8.5.2 匿名导入包——只导入包但不使用包内类型和数值
8.5.3 理解包导入初始化顺序
8.6 示例:工厂模式自动注册 ——管理多个包的结构体
第9章 并发
9.1 轻量级线程(goroutine)——根据需要随时创建的“线程”
9.1.1 使用普通函数创建goroutine
9.1.2 使用匿名函数创建goroutine
9.1.3 调整并发的运行性能(GOMAXPROCS)
9.1.4 理解并发和并行
9.1.5 理解Go的协作程序(goroutine)和普通的协作程序(coroutine)
9.2 通道(channel) ——在多个goroutine间通信的管道
9.2.1 通道的特性
9.2.2 声明通道类型
9.2.3 创建通道
9.2.4 使用通道发送数据
9.2.5 使用通道接收数据
9.2.6 关闭通道后继续使用通道
9.2.7 示例:并发打印
9.2.8 单向通道——通道中的单行道
9.2.9 带缓冲的通道——允许在通道中保存一定数量的数据
9.2.10 通道的多路复用——同时处理接收和发送多个通道的数据
9.2.11 示例:模拟远程过程调用(RPC)
9.2.12 示例:使用通道响应计时器的事件
9.3 示例:Telnet回音服务器——TCP服务器的基本结构
9.4 同步——保证并发环境下数据访问的正确性
9.4.1 竞态检测——检测代码在并发环境下可能出现的问题
9.4.2 互斥锁(sync.Mutex)——保证同时只有一个goroutine可以访问共享资源
9.4.3 读写互斥锁(sync.RWMutex)——在读比写多的环境下比互斥锁更高效
9.4.4 等待组(sync.WaitGroup)——保证在并发环境中完成指定数量的任务
第10章 反射
10.1 反射的类型对象(reflect.Type)
10.1.1 理解反射的类型(Type)与种类(Kind)
10.1.2 指针与指针指向的元素
10.1.3 使用反射获取结构体的成员类型
10.1.4 结构体标记(Struct Tag)——对结构体字段的额外信息标记
10.2 反射的值对象(reflect.Value)
10.2.1 使用反射值对象包装任意值
10.2.2 从反射值对象获取被包装的值
10.2.3 使用反射访问结构体的成员字段的值
10.2.4 判定反射的零值和空
10.2.5 使用反射值对象修改变量的值
10.2.6 通过类型创建类型的实例
10.2.7 使用反射调用函数
10.3 示例:将结构体的数据保存为JSON格式的文本数据
第11章 编译与工具
11.1 编译(go build)
11.1.1 go build无参数编译
11.1.2 go build + 文件列表
11.1.3 go build + 包
11.1.4 go build编译时的附加参数
11.2 编译后运行(go run)
11.3 编译并安装(go install)
11.2 一键获取代码、编译并安装(go get)
11.2.1 远程包的路径格式
11.2.2 go get + 远程包
11.2.3 go get使用时的附加参数
11.3 测试(go test)
11.3.1 单元测试——测试和验证代码的框架
11.3.2 基准测试——获得代码内存占用和运行效率的性能数据
11.4 性能分析(go pprof)——发现代码性能问题的调用位置
11.4.1 安装第三方图形化显式分析数据工具(Graphviz)
11.4.2 安装第三方性能分析分析代码包
11.4.3 性能分析代码
第12章 避坑与技巧
12.1 合理的使用并发特性
12.1.1 了解goroutine的生命期时再创建goroutine
12.1.2 避免在不必要的地方使用通道
12.2 反射:性能和灵活性的双刃剑
12.3 接口的nil判断
12.4 map的多键索引——多个数值条件可以同时查询
12.4.1 基于哈希值的多键索引及查询
12.4.2 利用map特性的多键索引及查询
12.4.3 总结
12.5 优雅的处理TCP粘包——一套完备的TCP协议的客户端和服务器框架
· · · · · ·
发表回复
要发表评论,您必须先登录。