科技
类型
7.6
豆瓣评分
可以朗读
语音朗读
347千字
字数
2019-07-01
发行日期
展开全部
主编推荐语
Go语言进阶实战,CGO编程web编程书。
内容简介
本书从实践出发讲解Go语言的进阶知识。本书共6章,第1章简单回顾Go语言的发展历史;第2章和第3章系统地介绍CGO编程和Go汇编语言的用法;第4章对RPC和Protobuf技术进行深入介绍,并讲述如何打造一个自己的RPC系统;第5章介绍工业级环境的Web系统的设计和相关技术;第6章介绍Go语言在分布式领域的一些编程技术。书中还涉及CGO和汇编方面的知识,其中CGO能够帮助读者继承的软件遗产,而在深入学习Go运行时,汇编对于理解各种语法设计的底层实现是必不可少的知识。此外,本书还包含一些紧跟潮流的内容,介绍开源界流行的gRPC及其相关应用,讲述Go Web框架中的基本实现原理和大型Web项目中的技术要点,引导读者对Go语言进行更深入的应用。
本书适合对Go语言的应用已经有一些心得,并希望能够深入理解底层实现原理或者是希望能够在Web开发方面结合Go语言来实现进阶学习的技术人员学习和参考。
目录
- 版权信息
- 内容提要
- 序一
- 序二
- 前言
- 致谢
- 资源与支持
- 第1章 语言基础
- 1.1 Go语言创世纪
- 1.1.1 来自贝尔实验室特有基因
- 1.1.2 你好,世界
- 1.2 “Hello, World”的革命
- 1.2.1 B语言——Ken Thompson, 1969
- 1.2.2 C语言——Dennis Ritchie,1972—1989
- 1.2.3 Newsqueak——Rob Pike, 1989
- 1.2.4 Alef——Phil Winterbottom, 1993
- 1.2.5 Limbo——Sean Dorward, Phil Winterbottom, Rob Pike, 1995
- 1.2.6 Go语言——2007—2009
- 1.2.7 你好,世界!——V2.0
- 1.3 数组、字符串和切片
- 1.3.1 数组
- 1.3.2 字符串
- 1.3.3 切片
- 1.4 函数、方法和接口
- 1.4.1 函数
- 1.4.2 方法
- 1.4.3 接口
- 1.5 面向并发的内存模型
- 1.5.1 Goroutine和系统线程
- 1.5.2 原子操作
- 1.5.3 顺序一致性内存模型
- 1.5.4 初始化顺序
- 1.5.5 Goroutine的创建
- 1.5.6 基于通道的通信
- 1.5.7 不靠谱的同步
- 1.6 常见的并发模式
- 1.6.1 并发版本的“Hello, World”
- 1.6.2 生产者/消费者模型
- 1.6.3 发布/订阅模型
- 1.6.4 控制并发数
- 1.6.5 赢者为王
- 1.6.6 素数筛
- 1.6.7 并发的安全退出
- 1.6.8 context包
- 1.7 错误和异常
- 1.7.1 错误处理策略
- 1.7.2 获取错误的上下文
- 1.7.3 错误的错误返回
- 1.7.4 剖析异常
- 1.8 补充说明
- 第2章 CGO编程
- 2.1 快速入门
- 2.1.1 最简CGO程序
- 2.1.2 基于C标准库函数输出字符串
- 2.1.3 使用自己的C函数
- 2.1.4 C代码的模块化
- 2.1.5 用Go重新实现C函数
- 2.1.6 面向C接口的Go编程
- 2.2 CGO基础
- 2.2.1 import "C"语句
- 2.2.2 #cgo语句
- 2.2.3 build标志条件编译
- 2.3 类型转换
- 2.3.1 数值类型
- 2.3.2 Go 字符串和切片
- 2.3.3 结构体、联合和枚举类型
- 2.3.4 数组、字符串和切片
- 2.3.5 指针间的转换
- 2.3.6 数值和指针的转换
- 2.3.7 切片间的转换
- 2.4 函数调用
- 2.4.1 Go调用C函数
- 2.4.2 C函数的返回值
- 2.4.3 void函数的返回值
- 2.4.4 C调用Go导出函数
- 2.5 内部机制
- 2.5.1 CGO生成的中间文件
- 2.5.2 Go调用C函数
- 2.5.3 C调用Go函数
- 2.6 实战:封装qsort
- 2.6.1 认识qsort()函数
- 2.6.2 将qsort()函数从Go包导出
- 2.6.3 改进:闭包函数作为比较函数
- 2.6.4 改进:消除用户对unsafe包的依赖
- 2.7 CGO内存模型
- 2.7.1 Go访问C内存
- 2.7.2 C临时访问传入的Go内存
- 2.7.3 C长期持有Go指针对象
- 2.7.4 导出C函数不能返回Go内存
- 2.8 C++类包装
- 2.8.1 C++类到Go语言对象
- 2.8.2 Go语言对象到C++类
- 2.8.3 彻底解放C++的this指针
- 2.9 静态库和动态库
- 2.9.1 使用C静态库
- 2.9.2 使用C动态库
- 2.9.3 导出C静态库
- 2.9.4 导出C动态库
- 2.9.5 导出非main包的函数
- 2.10 编译和链接参数
- 2.10.1 编译参数:CFLAGS/CPPFLAGS/CXXFLAGS
- 2.10.2 链接参数:LDFLAGS
- 2.10.3 pkg-config
- 2.10.4 go get链
- 2.10.5 多个非main包中导出C函数
- 2.11 补充说明
- 第3章 Go汇编语言
- 3.1 快速入门
- 3.1.1 实现和声明
- 3.1.2 定义整数变量
- 3.1.3 定义字符串变量
- 3.1.4 定义main()函数
- 3.1.5 特殊字符
- 3.1.6 没有分号
- 3.2 计算机结构
- 3.2.1 图灵机和BrainFuck语言
- 3.2.2 《人力资源机器》游戏
- 3.2.3 X86-64体系结构
- 3.2.4 Go汇编中的伪寄存器
- 3.2.5 X86-64指令集
- 3.3 常量和全局变量
- 3.3.1 常量
- 3.3.2 全局变量
- 3.3.3 变量的内存布局
- 3.3.4 标识符规则和特殊标志
- 3.3.5 小结
- 3.4 函数
- 3.4.1 基本语法
- 3.4.2 函数参数和返回值
- 3.4.3 参数和返回值的内存布局
- 3.4.4 函数中的局部变量
- 3.4.5 调用其他函数
- 3.4.6 宏函数
- 3.5 控制流
- 3.5.1 顺序执行
- 3.5.2 if/goto跳转
- 3.5.3 for循环
- 3.6 再论函数
- 3.6.1 函数调用规范
- 3.6.2 高级汇编语言
- 3.6.3 PCDATA和FUNCDATA
- 3.6.4 方法函数
- 3.6.5 递归函数: 1到n求和
- 3.6.6 闭包函数
- 3.7 汇编语言的威力
- 3.7.1 系统调用
- 3.7.2 直接调用C函数
- 3.7.3 AVX指令
- 3.8 例子:Goroutine ID
- 3.8.1 故意设计没有goid
- 3.8.2 纯Go方式获取goid
- 3.8.3 从g结构体获取goid
- 3.8.4 获取g结构体对应的接口对象
- 3.8.5 goid的应用:局部存储
- 3.9 Delve调试器
- 3.9.1 Delve入门
- 3.9.2 调试汇编程序
- 3.10 补充说明
- 第4章 RPC和Protobuf
- 4.1 RPC入门
- 4.1.1 RPC版“Hello, World”
- 4.1.2 更安全的RPC接口
- 4.1.3 跨语言的RPC
- 4.1.4 HTTP上的RPC
- 4.2 Protobuf
- 4.2.1 Protobuf入门
- 4.2.2 定制代码生成插件
- 4.2.3 自动生成完整的RPC代码
- 4.3 玩转RPC
- 4.3.1 客户端RPC的实现原理
- 4.3.2 基于RPC实现监视功能
- 4.3.3 反向RPC
- 4.3.4 上下文信息
- 4.4 gRPC入门
- 4.4.1 gRPC技术栈
- 4.4.2 gRPC入门
- 4.4.3 gRPC流
- 4.4.4 发布和订阅模式
- 4.5 gRPC进阶
- 4.5.1 证书认证
- 4.5.2 Token认证
- 4.5.3 截取器
- 4.5.4 和Web服务共存
- 4.6 gRPC和Protobuf扩展
- 4.6.1 验证器
- 4.6.2 REST接口
- 4.6.3 Nginx
- 4.7 pbgo:基于Protobuf的框架
- 4.7.1 Protobuf扩展语法
- 4.7.2 插件中读取扩展信息
- 4.7.3 生成REST代码
- 4.7.4 启动REST服务
- 4.8 grpcurl工具
- 4.8.1 启动反射服务
- 4.8.2 查看服务列表
- 4.8.3 服务的方法列表
- 4.8.4 获取类型信息
- 4.8.5 调用方法
- 4.9 补充说明
- 第5章 Go和Web
- 5.1 Web开发简介
- 5.2 请求路由
- 5.2.1 httprouter
- 5.2.2 原理
- 5.2.3 压缩检索树创建过程
- 5.3 中间件
- 5.3.1 代码泥潭
- 5.3.2 使用中间件剥离非业务逻辑
- 5.3.3 更优雅的中间件写法
- 5.3.4 哪些事情适合在中间件中做
- 5.4 请求校验
- 5.4.1 重构请求校验函数
- 5.4.2 用请求校验器解放体力劳动
- 5.4.3 原理
- 5.5 Database 和数据库打交道
- 5.5.1 从database/sql讲起
- 5.5.2 提高生产效率的ORM和SQL Builder
- 5.5.3 脆弱的数据库
- 5.6 服务流量限制
- 5.6.1 常见的流量限制手段
- 5.6.2 原理
- 5.6.3 服务瓶颈和 QoS
- 5.7 常见大型Web项目分层
- 5.8 接口和表驱动开发
- 5.8.1 业务系统的发展过程
- 5.8.2 使用函数封装业务流程
- 5.8.3 使用接口来做抽象
- 5.8.4 接口的优缺点
- 5.8.5 表驱动开发
- 5.9 灰度发布和A/B测试
- 5.9.1 通过分批次部署实现灰度发布
- 5.9.2 通过业务规则进行灰度发布
- 5.9.3 如何实现一套灰度发布系统
- 5.10 补充说明
- 第6章 分布式系统
- 6.1 分布式ID生成器
- 6.1.1 worker_id分配
- 6.1.2 开源实例
- 6.2 分布式锁
- 6.2.1 进程内加锁
- 6.2.2 尝试锁
- 6.2.3 基于Redis的setnx
- 6.2.4 基于ZooKeeper
- 6.2.5 基于etcd
- 6.2.6 如何选择合适的锁
- 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 ZooKeeper集群的随机节点挑选问题
- 6.5.4 负载均衡算法效果验证
- 6.6 分布式配置管理
- 6.6.1 场景举例
- 6.6.2 使用etcd实现配置更新
- 6.6.3 配置膨胀
- 6.6.4 配置版本管理
- 6.6.5 客户端容错
- 6.7 分布式爬虫
- 6.7.1 基于colly的单机爬虫
- 6.7.2 分布式爬虫
- 6.7.3 结合nats和colly的消息生产
- 6.7.4 结合colly的消息消费
- 6.8 补充说明
- 附录A 使用Go语言常遇到的问题
- A.1 可变参数是空接口类型
- A.2 数组是值传递
- A.3 map遍历时顺序不固定
- A.4 返回值被屏蔽
- A.5 recover()必须在defer函数中运行
- A.6 main()函数提前退出
- A.7 通过Sleep()来回避并发中的问题
- A.8 独占CPU导致其他Goroutine饿死
- A.9 不同Goroutine之间不满足顺序一致性内存模型
- A.10 闭包错误引用同一个变量
- A.11 在循环内部执行defer语句
- A.12 切片会导致整个底层数组被锁定
- A.13 空指针和空接口不等价
- A.14 内存地址会变化
- A.15 Goroutine泄漏
- 附录B 有趣的代码片段
- B.1 自重写程序
- B.2 三元表达式
- B.3 禁止main()函数退出的方法
- B.4 基于通道的随机数生成器
- B.5 用Assert()测试断言
展开全部
出版方
人民邮电出版社
人民邮电出版社是工业和信息化部主管的大型专业出版社,成立于1953年10月1日。人民邮电出版社坚持“立足信息产业、面向现代社会、传播科学知识、服务科教兴国”,致力于通信、计算机、电子技术、教材、少儿、经管、摄影、集邮、旅游、心理学等领域的专业图书出版。