Go语言高级编程

Go语言高级编程

立即阅读
手机扫码
  • 微信扫一扫

    关注微信公众号

编辑推荐

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语言来实现进阶学习的技术人员学习和参考。

作者简介

作者曹春晖,在Web 领域工作多年,开源爱好者。对大型网站系统的架构和相关工具的实现很感兴趣,并且有一些研究成果。目前在滴滴平台技术部工作。

章节目录

版权信息

内容提要

序一

序二

前言

致谢

资源与支持

第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()测试断言

Go语言高级编程是2019年由人民邮电出版社出版,作者柴树杉。

得书感谢您对《Go语言高级编程》关注和支持,如本书内容有不良信息或侵权等情形的,请联系本网站。

你可能喜欢
现代C++语言核心特性解析 电子书
通过理论结合实践的内容编排,深入探讨C11到C20引入的语言核心特性。
C语言程序设计:现代方法(第2版·修订版) 电子书
C语言入门零基础自学教程新升级,增加C1X相关内容,讲述C的所有特性,国外诸多名校的C语言课程教材,C开发人员的参考书。
代码整洁之道 电子书
“阅读这本书有两种原因:第一,你是个程序员;第二,你想成为更好的程序员。很好,IT行业需要更好的程序员!”——罗伯特·C. 马丁(Robert C. Martin) 尽管糟糕的代码也能运行,但如果代码不整洁,会使整个开发团队泥足深陷,写得不好的代码每年都要耗费难以计数的时间和资源。但是,这种情况并非无法避免。 著名软件专家罗伯特·C. 马丁(Robert C. Martin) 在本书中为你呈现了革命性的视野。他携同Object Mentor公司的同事,从他们有关整洁代码的佳敏捷实践中提炼出软件技艺的价值观,以飨读者,让你成为更优秀的程序员——只要你着手研读本书。 阅读本书需要你做些什么呢?你将阅读代码——大量代码。本书会促使你思考何谓正确的代码,何谓错误的代码。更重要的是,本书将促使你重新评估自己的专业价值观,以及对自己技艺的承诺。 书中的具体内容包括: ·好代码和糟糕的代码之间的区别; ·如何编写好代码,如何将糟糕的代码转化为好代码; ·如何创建好名称、好函数、好对象和好类; ·如何格式化代码以实现其可读性的大化; ·如何在不妨碍代码逻辑的前提下充分实现错误处理; ·如何进行单元测试和测试驱动开发。
汇编语言编程基础:基于LoongArch 电子书
本书是龙芯自主指令集的汇编语言教程,系统讲解龙芯处理器全新的自主指令系统架构LoongArch。
第一行代码  C语言(视频讲解版) 电子书
学习程序设计,初学者往往遇到这样的困境:语言规则可以倒背如流,但写出的代码总是编译通不过,即使编译通过了却也得不出想要的结果。怎么办?《行代码 C语言》可以给你提供帮助。 你不需要具备高深的数学和电子学知识,只需要训练自己以计算机能够理解的方式去表达自己的逻辑,也就是要具备“计算思维”,寻找到解决问题的方法,然后用编程语言去指挥计算机执行即可。因此,本书与常规的C语言书不同,除了C语言本身的语法规则外,本书更关注的是培养初学者具有程序设计的思想,掌握程序设计的方法。 另外,计蒜客在线教育团队,为本书的读者提供了伴随式的在线编程平台支持,读者可以将图书和线上编程结合起来学习。 提供扫码看视频服务,全书94个微视频,总时长超过1000分钟。 提供辅助教学资源包,包括实验、试卷及答案、教学大纲、PPT等。