互联网
类型
7.4
豆瓣评分
可以朗读
语音朗读
249千字
字数
2021-08-01
发行日期
展开全部
主编推荐语
深入浅出,层层递进,讲解Go语言背后的逻辑。
内容简介
Go语言是一门年轻、简捷,但是强大、高效、充满潜力的服务器语言。
本书使用浅显易懂的语言与大量图片深入介绍了Go语言编译时、类型系统、语法特性、函数调用规范、并发编程、内存管理与垃圾回收、运行状态监控等模块的使用方法和底层原理,并举例说明了构建大型软件工程需要遵循的设计规则,让作者系统并完整掌握Go语言隐藏在使用方法背后的底层细节。
本书适合有一定工作经验的开发工程师进一步提升自己,以便更好地开发软件、系统架构,并进行工作面试。也可以作为高等院校计算机专业师生学习编程语言设计原理的参考教材。
目录
- 版权信息
- 内容简介
- 前言
- 第1章 深入Go语言编译器
- 1.1 为什么要了解Go语言编译器
- 1.2 Go语言编译器的阶段
- 1.3 词法解析
- 1.4 语法解析
- 1.5 抽象语法树构建
- 1.6 类型检查
- 1.7 变量捕获
- 1.8 函数内联
- 1.9 逃逸分析
- 1.10 闭包重写
- 1.11 遍历函数
- 1.12 SSA生成
- 1.13 机器码生成——汇编器
- 1.14 机器码生成——链接
- 1.15 ELF文件解析
- 1.16 总结
- 第2章 浮点数设计原理与使用方法
- 2.1 浮点数陷阱
- 2.2 定点数与浮点数
- 2.3 IEEE-754浮点数标准
- 2.3.1 小数部分计算
- 2.3.2 显示浮点数格式
- 2.4 最佳实践:判断浮点数为整数
- 2.5 常规数与非常规数
- 2.6 NaN与Inf
- 2.7 浮点数精度
- 2.8 浮点数与格式化打印
- 2.9 浮点数计算与精度损失
- 2.10 多精度浮点数与math/big库
- 2.11 总结
- 第3章 类型推断全解析
- 3.1 类型推断的优势
- 3.2 Go语言中类型推断的特性
- 3.3 类型推断原理
- 3.3.1 词法解析与语法分析阶段
- 3.3.2 抽象语法树生成与类型检查
- 3.4 总结
- 第4章 常量与隐式类型转换
- 4.1 常量声明与生存周期
- 4.2 常量类型转换
- 4.2.1 隐式整数转换
- 4.2.2 隐式浮点数转换
- 4.2.3 常量运算中的隐式转换
- 4.2.4 常量与变量之间的转换
- 4.2.5 自定义类型的转换
- 4.3 常量与隐式类型转换原理
- 4.4 总结
- 第5章 字符串本质与实现
- 5.1 字符串的本质
- 5.2 符文类型
- 5.3 字符串工具函数
- 5.4 字符串底层原理
- 5.4.1 字符串解析
- 5.4.2 字符串拼接
- 5.4.3 运行时字符拼接
- 5.4.4 字符串与字节数组的转换
- 5.5 总结
- 第6章 数组
- 6.1 数组的声明方式
- 6.2 数组值复制
- 6.3 数组底层原理
- 6.3.1 编译时数组解析
- 6.3.2 数组字面量初始化原理
- 6.3.3 数组字面量编译时内存优化
- 6.3.4 数组索引与访问越界原理
- 6.4 总结
- 第7章 切片使用方法与底层原理
- 7.1 切片使用方法
- 7.1.1 切片的结构
- 7.1.2 切片的初始化
- 7.1.3 切片的截取
- 7.1.4 切片值复制与数据引用
- 7.1.5 切片收缩与扩容
- 7.2 切片底层原理
- 7.2.1 字面量初始化
- 7.2.2 make初始化
- 7.2.3 切片扩容原理
- 7.2.4 切片截取原理
- 7.2.5 切片的完整复制
- 7.3 总结
- 第8章 哈希表与Go语言实现机制
- 8.1 哈希碰撞与解决方法
- 8.2 map基本操作
- 8.2.1 map声明与初始化
- 8.2.2 map访问
- 8.2.3 map赋值
- 8.2.4 key的比较性
- 8.2.5 map并发冲突
- 8.3 哈希表底层结构
- 8.4 哈希表原理图解
- 8.5 深入哈希表原理
- 8.5.1 make初始化原理
- 8.5.2 字面量初始化原理
- 8.5.3 map访问原理
- 8.5.4 map赋值操作原理
- 8.5.5 map重建原理
- 8.5.6 map删除原理
- 8.6 总结
- 第9章 函数与栈
- 9.1 函数基本使用方式
- 9.2 函数闭包与陷阱
- 9.3 函数栈
- 9.4 Go语言栈帧结构
- 9.5 Go语言函数调用链结构与特性
- 9.6 堆栈信息
- 9.7 栈扩容与栈转移原理
- 9.8 栈调试
- 9.9 总结
- 第10章 defer延迟调用
- 10.1 使用defer的优势
- 10.1.1 资源释放
- 10.1.2 异常捕获
- 10.2 defer特性
- 10.2.1 延迟执行
- 10.2.2 参数预计算
- 10.2.3 defer多次执行与LIFO执行顺序
- 10.3 defer返回值陷阱
- 10.4 defer底层原理
- 10.4.1 defer演进
- 10.4.2 堆分配
- 10.4.3 defer遍历调用
- 10.4.4 Go 1.13栈分配优化
- 10.4.5 Go 1.14内联优化
- 10.5 总结
- 第11章 异常与异常捕获
- 11.1 panic函数使用方法
- 11.2 异常捕获与recover
- 11.3 panic与recover嵌套
- 11.4 panic函数底层原理
- 11.5 recover底层原理
- 11.6 总结
- 第12章 接口与程序设计模式
- 12.1 接口的用途
- 12.2 Go语言中的接口
- 12.3 Go接口实践
- 12.4 Go接口的使用方法
- 12.4.1 Go接口的声明与定义
- 12.4.2 接口实现
- 12.4.3 接口动态类型
- 12.4.4 接口的动态调用
- 12.4.5 多接口
- 12.4.6 接口的组合
- 12.4.7 接口类型断言
- 12.4.8 空接口
- 12.4.9 接口的比较性
- 12.5 接口底层原理
- 12.5.1 接口实现算法
- 12.5.2 接口组成
- 12.5.3 接口内存逃逸分析
- 12.5.4 接口动态调用过程
- 12.5.5 接口动态调用过程的效率评价
- 12.5.6 接口转换
- 12.5.7 空接口组成
- 12.5.8 空接口switch
- 12.5.9 接口的陷阱
- 12.6 总结
- 第13章 反射高级编程
- 13.1 为什么需要反射
- 13.2 反射的基本使用方法
- 13.2.1 反射的两种基本类型
- 13.2.2 反射转换为接口
- 13.2.3 Elem()间接访问
- 13.2.4 修改反射的值
- 13.2.5 结构体与反射
- 13.2.6 遍历结构体字段
- 13.2.7 修改结构体字段
- 13.2.8 嵌套结构体的赋值
- 13.2.9 结构体方法与动态调用
- 13.2.10 反射在运行时创建结构体
- 13.2.11 函数与反射
- 13.2.12 反射与其他类型
- 13.3 反射底层原理
- 13.3.1 reflect.Type详解
- 13.3.2 Interface方法原理
- 13.3.3 Int方法原理
- 13.3.4 Elem方法释疑
- 13.3.5 动态调用剖析
- 13.4 总结
- 第14章 协程初探
- 14.1 进程与线程
- 14.2 线程上下文切换
- 14.3 线程与协程
- 14.3.1 调度方式
- 14.3.2 上下文切换的速度
- 14.3.3 调度策略
- 14.3.4 栈的大小
- 14.4 并发与并行
- 14.5 简单协程入门
- 14.6 主协程与子协程
- 14.7 GMP模型
- 14.8 总结
- 第15章 深入协程设计与调度原理
- 15.1 协程的生命周期与状态转移
- 15.2 特殊协程g0与协程切换
- 15.3 线程本地存储与线程绑定
- 15.4 调度循环
- 15.5 调度策略
- 15.5.1 获取本地运行队列
- 15.5.2 获取全局运行队列
- 15.5.3 获取准备就绪的网络协程
- 15.5.4 协程窃取
- 15.6 调度时机
- 15.6.1 主动调度
- 15.6.2 被动调度
- 15.6.3 抢占调度
- 15.6.4 执行时间过长的抢占调度
- 15.7 总结
- 第16章 通道与协程间通信
- 16.1 CSP并发编程
- 16.2 通道基本使用方式
- 16.2.1 通道声明与初始化
- 16.2.2 通道写入数据
- 16.2.3 通道读取数据
- 16.2.4 通道关闭
- 16.2.5 通道作为参数和返回值
- 16.2.6 单方向通道
- 16.2.7 通道最佳实践
- 16.3 select多路复用
- 16.3.1 select随机选择机制
- 16.3.2 select堵塞与控制
- 16.3.3 循环select
- 16.3.4 select与nil
- 16.4 通道底层原理
- 16.4.1 通道结构与环形队列
- 16.4.2 通道初始化
- 16.4.3 通道写入原理
- 16.4.4 通道读取原理
- 16.5 select底层原理
- 16.5.1 select一轮循环
- 16.5.2 select二轮循环
- 16.6 总结
- 第17章 并发控制
- 17.1 context
- 17.1.1 为什么需要context
- 17.1.2 context使用方式
- 17.2 context原理
- 17.3 数据争用检查
- 17.3.1 什么是数据争用
- 17.3.2 数据争用检查详解
- 17.3.3 race工具原理
- 17.4 锁
- 17.4.1 原子锁
- 17.4.2 互斥锁
- 17.4.3 互斥锁实现原理
- 17.4.4 互斥锁的释放
- 17.4.5 读写锁
- 17.4.6 读写锁原理
- 17.5 总结
- 第18章 内存分配管理
- 18.1 Go语言内存分配全局视野
- 18.1.1 span与元素
- 18.1.2 三级对象管理
- 18.1.3 四级内存块管理
- 18.2 对象分配
- 18.2.1 微小对象
- 18.2.2 mcache缓存位图
- 18.2.3 mcentral遍历span
- 18.2.4 mheap缓存查找
- 18.2.5 mheap基数树查找
- 18.2.6 操作系统内存申请
- 18.2.7 小对象分配
- 18.2.8 大对象分配
- 18.3 总结
- 第19章 垃圾回收初探
- 19.1 为什么需要垃圾回收
- 19.1.1 减少错误和复杂性
- 19.1.2 解耦
- 19.2 垃圾回收的5种经典算法
- 19.2.1 标记-清扫
- 19.2.2 标记-压缩
- 19.2.3 半空间复制
- 19.2.4 引用计数
- 19.2.5 分代GC
- 19.3 Go语言中的垃圾回收
- 19.3.1 为什么不选择压缩GC?
- 19.3.2 为什么不选择分代GC?
- 19.4 Go垃圾回收演进
- 19.5 总结
- 第20章 深入垃圾回收全流程
- 20.1 垃圾回收循环
- 20.2 标记准备阶段
- 20.2.1 计算标记协程的数量
- 20.2.2 切换到后台标记协程
- 20.3 并发标记阶段
- 20.3.1 根对象扫描
- 20.3.2 全局变量扫描
- 20.3.3 finalizer
- 20.3.4 栈扫描
- 20.3.5 栈对象
- 20.3.6 扫描灰色对象
- 20.4 标记终止阶段
- 20.5 辅助标记
- 20.6 屏障技术
- 20.7 垃圾清扫
- 20.7.1 懒清扫逻辑
- 20.7.2 辅助清扫
- 20.8 系统驻留内存清除
- 20.9 实战:垃圾回收产生的性能问题
- 20.10 总结
- 第21章 调试利器:特征分析与事件追踪
- 21.1 pprof的使用方式
- 21.1.1 堆内存特征分析
- 21.1.2 pprof可视化结果说明
- 21.1.3 pprof协程栈分析
- 21.1.4 base基准分析
- 21.1.5 mutex堵塞分析
- 21.1.6 CPU占用分析
- 21.2 火焰图分析
- 21.3 trace事件追踪
- 21.3.1 trace工具的用法与说明
- 21.3.2 trace分析场景
- 21.4 pprof底层原理
- 21.4.1 堆内存样本
- 21.4.2 协程栈样本收集原理
- 21.4.3 CPU样本收集原理
- 21.4.4 pprof分析原理
- 21.5 trace底层原理
- 21.6 总结
展开全部
出版方
电子工业出版社
电子工业出版社成立于1982年10月,是国务院独资、工信部直属的中央级科技与教育出版社,是专业的信息技术知识集成和服务提供商。经过三十多年的建设与发展,已成为一家以科技和教育出版、期刊、网络、行业支撑服务、数字出版、软件研发、软科学研究、职业培训和教育为核心业务的现代知识服务集团。出版物内容涵盖了电子信息技术的各个分支及工业技术、经济管理、科普与少儿、社科人文等领域,综合出版能力位居全国出版行业前列。