关注我的公众号:电子书分享考拉、更多书籍访问:http://www.kaolashuwu.com/ 目录 1. Introduction 1.1 2. 第1章 语言基础 1.2 1. 1.1 Go语言创世纪 1.2.1 2. 1.2 Hello, World 的革命 1.2.2 3. 1.3 数组、字符串和切片 1.2.3 4. 1.4 函数、方法和接口 1.2.4 5. 1.5 面向并发的内存模型 1.2.5 6. 1.6 常见的并发模式 1.2.6 7. 1.7 错误和异常 1.2.7 8. 1.8 补充说明 1.2.8 第2章 CGO编程 1.3 3. 1. 2.1 快速入门 1.3.1 2. 2.2 CGO基础 1.3.2 3. 2.3 类型转换 1.3.3 4. 2.4 函数调用 1.3.4 5. 2.5 内部机制 1.3.5 6. 2.6 实战: 封装qsort 1.3.6 7. 2.7 CGO内存模型 1.3.7 8. 2.8 C++类包装 1.3.8 9. 2.9 静态库和动态库 1.3.9 10. 2.10 编译和链接参数 1.3.10 11. 2.11 补充说明 1.3.11 第3章 汇编语言 1.4 4. 1. 3.1 快速入门 1.4.1 2. 3.2 计算机结构 1.4.2 3. 3.3 常量和全局变量 1.4.3 4. 3.4 函数 1.4.4 5. 3.5 控制流 1.4.5 6. 3.6 再论函数 1.4.6 7. 3.7 汇编语言的威力 1.4.7 8. 3.8 例子:Goroutine ID 1.4.8 9. 3.9 Delve调试器 1.4.9 10. 3.10 补充说明 1.4.10 第4章 RPC和Protobuf 1.5 5. 1. 4.1 RPC入门 1.5.1 2. 4.2 Protobuf 1.5.2 3. 4.3 玩转RPC 1.5.3 4. 4.4 GRPC入门 1.5.4 5. 4.5 GRPC进阶 1.5.5 6. 4.6 GRPC和Protobuf扩展 1.5.6 7. 4.7 pbgo: 基于Protobuf的框架 1.5.7 8. 4.8 grpcurl工具 1.5.8 9. 4.9 补充说明 1.5.9 第5章 Go和Web 1.6 6. 1. 5.1 Web开发简介 1.6.1 2. 5.2 Router请求路由 1.6.2 3. 5.3 Middleware中间件 1.6.3 4. 5.4 Validator请求校验 1.6.4 5. 5.5 Database和数据库打交道 1.6.5 6. 5.6 Ratelimit 服务流量限制 1.6.6 7. 5.7 Layout大型web项目分层 1.6.7 8. 5.8 interface 和 table-driven 开发 1.6.8 5.9 灰度发布和 A/B test 1.6.9 9. 5.10 补充说明 1.6.10 10. 第6章 分布式系统 1.7 7. 1. 6.1 分布式 id 生成器 1.7.1 2. 6.2 分布式锁 1.7.2 3. 6.3 延时任务系统 1.7.3 4. 6.4 分布式搜索引擎 1.7.4 5. 6.5 负载均衡 1.7.5 6. 6.6 分布式配置管理 1.7.6 7. 6.7 分布式爬虫 1.7.7 8. 6.8 补充说明 1.7.8 附录 1.8 8. 1. 附录A: Go语言常见坑 1.8.1 2. 附录B: 有趣的代码片段 1.8.2 3. 附录C: 作者简介 1.8.3 Go语言高级编程(Advanced Go Programming) 本书涵盖CGO、Go汇编语言、RPC实现、Web框架实现、分布 式系统等高阶主题,针对Go语言有一定经验想深入了解Go语 言各种高级用法的开发人员。对于刚学习Go语言的读者,建 议先从 《Go语言圣经》 开始系统学习Go语言的基础知识。 作者:柴树杉,Github @chai2010 ,Twitter @chaishushan 作者:曹春晖,Github @cch123 网址: https://github.com/chai2010/advanced-goprogramming-book 在线阅读 https://chai2010.cn/advanced-go-programming-book/ https://www.gitbook.com/book/chai2010/advanced-goprogramming-book/ 关注微信公众号(golang-china) 版权声明 Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License 。 严禁任何商业行为使用或引用该文档的全部或部分内容! 欢迎大家提供建议! 序言 2009年11月,Google发布了Go语言,在世界范围内引发了轰 动。2015年和2016年中国区的Go语言大会分别在上海和北京 召开,来自Go语言团队的开发人员均作了相关的报告。纵观 这几年来的发展趋势,Go语言已经成为云计算、云存储时代 最重要的基础编程语言。 中国的Go语言社区是全球最大的Go语言社区,我们不仅仅从 一开始就始终紧跟着Go语言的发展脚步,同时也为Go语言的 发展作出了自己的巨大贡献。来自中国深圳的韦光京 (vcc.163@gmail.com)在2010年前后,关于MinGW的工作奠 定了Go语言对Windows平台的支持,同时也奠定了CGO对 Windows平台的支持。同样来自中国的 Minux(minux.ma@gmail.com)则作为Go语言核心团队的成 员,他参与了大量的Go语言核心设计和开发评审工作。同时 还有大量的国内Go语言爱好者积极参与了BUG的汇报和修复 等工作(作者也是其中之一)。 截至2018年,中国出版的Go语言相关教程有近15本之多,内 容主要涵盖Go语言基础编程、Web编程、并发编程和内部源码 剖析等诸多领域。但作为Go语言的资深用户,作者关注的Go 语言话题远远不止这些内容。其中CGO特性实现了Go语言对C 语言和C++语言的支持,使得Go语言可以无缝继承C/C++世界 数十年来积累的巨大软件资产。Go汇编语言更是提供了直接 访问底层机器指令的方法,让我们可以无限压榨程序中热点代 码的性能。目前国内互联网公司的新兴项目已经在逐渐向Go 语言生态转移,大型分布式系统的开发实战经验也是大家关心 的。这些高阶或前沿特性都是作者和本书所关注的话题。 本书针对有一定Go语言经验,想深入了解Go语言各种高级用 法的开发人员。对于Go语言新手,在阅读本书前建议先熟读 D&K的 《The Go Programming Language》 。最后,希望这本 书能够帮助大家更深入地了解Go语言。 chai2010 - 2018年 8 月 于 武汉 致谢 首先感谢Go语言之父和每一个为Go语言提交过补丁的朋友。 感谢fango的第一本以Go语言为主题的网络小说《胡文 Go.ogle》和第一本中文Go语言图书《Go语言·云动力》,是你 的分享让带起了大家学习Go语言的热情。感谢韦光京对 Windows平台CGO的开创性工作,不然本书可能不会有专门的 CGO章节。感谢为本书提交过issue或PR的朋友(特别是 fuwensun、lewgun等),你们的关注和支持是作者写作的最大 动力。 谢谢大家! 第1章 语言基础 本章首先简要介绍Go语言的发展历史,并较详细地分析 了“Hello World”程序在各个祖先语言中演化过程。然后,对以 数组、字符串和切片为代表的基础结构,对以函数、方法和接 口所体现的面向过程和鸭子对象的编程,以及Go语言特有的 并发编程模型和错误处理哲学做了简单介绍。最后,针对 macOS、Windows、Linux几个主流的开发平台,推荐了几个 较友好的Go语言编辑器和集成开发环境,因为好的工具可以 极大地提高我们的效率。 1.1 Go语言创世纪 Go语言最初由Google公司的Robert Griesemer、Ken Thompson 和Rob Pike三个大牛于2007年开始设计发明,设计新语言的最 初的洪荒之力来自于对超级复杂的C++11特性的吹捧报告的鄙 视,最终的目标是设计网络和多核时代的C语言。到2008年中 期,语言的大部分特性设计已经完成,并开始着手实现编译器 和运行时,大约在这一年Russ Cox作为主力开发者加入。到了 2010年,Go语言已经逐步趋于稳定,并在9月正式发布Go语言 并开源了代码。 Go语言很多时候被描述为“类C语言”,或者是“21世纪的C语 言”。从各种角度看,Go语言确实是从C语言继承了相似的表 达式语法、控制流结构、基础数据类型、调用参数传值、指针 等诸多编程思想,还有彻底继承和发扬了C语言简单直接的暴 力编程哲学等。图1-1是《Go语言圣经》中给出的Go语言的基 因图谱,我们可以从中看到有哪些编程语言对Go语言产生了 影响。 图 1.1-1 Go语言基因族谱 首先看基因图谱的左边一支。可以明确看出Go语言的并发特 性是由贝尔实验室的Hoare于1978年发布的CSP理论演化而 来。其后,CSP并发模型在Squeak/NewSqueak和Alef等编程语 言中逐步完善并走向实际应用,最终这些设计经验被消化并吸 收到了Go语言中。业界比较熟悉的Erlang编程语言的并发编程 模型也是CSP理论的另一种实现。 再看基因图谱的中间一支。中间一支主要包含了Go语言中面 向对象和包特性的演化历程。Go语言中包和接口以及面向对 象等特性则继承自Niklaus Wirth所设计的Pascal语言以及其后 所的衍生的相关编程语言。其中包的概念、包的导入和声明等 语法主要来自于Modula-2编程语言,面向对象特性所提供的方 法的声明语法等则来自于Oberon编程语言。最终Go语言演化 出了自己特有的支持鸭子面向对象模型的隐式接口等诸多特 性。 最后是基因图谱的右边一支,这是对C语言的致敬。Go语言是 对C语言最彻底的一次扬弃,不仅仅是语法和C语言有着很多 差异,最重要的是舍弃了C语言中灵活但是危险的指针运算。 而且,Go语言还重新设计了C语言中部分不太合理运算符的优 先级,并在很多细微的地方都做了必要的打磨和改变。当然, C语言中少即是多、简单直接的
Go语言高级编程
温馨提示:如果当前文档出现乱码或未能正常浏览,请先下载原文档进行浏览。
本文档由 user 于 2021-02-28 14:07:07上传分享