展开全部

主编推荐语

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()测试断言
展开全部

评分及书评

评分不足
2个评分
  • 用户头像
    给这本书评了
    3.0

    知乎有人推荐,但书整体很一般。首先是深度不够。书中讲了很多高级用法,但基本上是蜻蜓点水似的过了一下;另一方面是其次是内容结构有点混乱。整书纳入了很多内容,甚至连汇编也都纳入了。从这点上来讲,你说他没深度似乎也不对。但问题在于讲汇编并不适合于绝大多数的程序员,因为没有这方面的基础是不可能看懂的。因此让书没了主心骨。最后一点感受是作者想要纳入的东西太多太杂,反而让整本书没有了明确的定位。总的来讲,如果读者对书中所讲到的主题已经较好的基础和经验,那么这本书还是能有一些收获。但无法成为一本好的参考书,只是过一下就差不多能扔在一边了。

      转发
      评论

    出版方

    人民邮电出版社

    人民邮电出版社是工业和信息化部主管的大型专业出版社,成立于1953年10月1日。人民邮电出版社坚持“立足信息产业、面向现代社会、传播科学知识、服务科教兴国”,致力于通信、计算机、电子技术、教材、少儿、经管、摄影、集邮、旅游、心理学等领域的专业图书出版。