本书基于Go语言源码提炼出Go特性的实现原理,并配以大量图表和实例以通俗易懂的语言描述出来,包括常见数据结构实现原理(包括chan、slice、map、struct等),常见控制结构实现原理(包括defer、select、range、mutex等),Go协程、内存管理、反射等机制,Go 工具链指导及原理(包括单元测试、性能测试、依赖管理等)。另外,本书还包括由实际项目Bug复盘而来的案例分享,包括定时器资源泄露、语法糖陷阱等。本书还包含大量练习题目,甚至可以作为面试题目来源。
华为资深工程师力作
精选实战题目+答案解析助力面试通关
序
Go语言是一门相对比较年轻的语言,不仅得益于其优秀的设计,同时借鉴了现有多种成熟语言的丰富经验,使得Go语言成为历史上发展最为迅速的编程语言之一。尤其在云原生领域,由Docker、Kubernetes为代表的大批开源明星项目大幅推动了Go语言的发展,乃至当前CNCF(Cloud Native Computing Foundation,云原生计算基金会)旗下的绝大部分开源项目都是以Go语言为主要编程语言。如同近十年AI尤其是深度学习神经网络的高速发展将Python语言推进至“人工智能领域的首选编程语言”一样,我们可以毫不夸张地说,Go语言已经成为“云原生领域的首选编程语言”。
华为公司也是Go语言的早期实践者之一。早在2012年Go语言1.0版本发布之初,公司编程语言工程能力组就已经对Go 1.0进行了详细的分析,并对Go的设计理念、优缺点进行了总结,给出了推荐在分布式系统尤其是云计算相关业务中进行使用的建议意见。随后,华为云研发团队在容器、PaaS(Platform as a Service)、中间件等部分业务中使用Go语言进行了原型和产品开发,同时构建了公司Go语言相关的工具链和安全编程规范等指导说明,并使用了Go语言相关的多个开源项目比如Beego、InfluxDB、NATS、ETCD,等等。尤其2013年之后,随着华为云原生开源团队大力投入Docker、Kubernetes、Prometheus、Istio等开源生态项目,并且基于相关项目陆续推出了多个云原生领域的华为云服务产品,Go语言在华为云业务中的地位越来越重要。2018年,Go语言正式成为华为公司官方指定的五种主流编程语言之一(其他包括C、C++、Java、Python),进入华为公司员工技能培训与认证体系,并成为华为云服务开发的推荐语言之一。
Go语言以语法特性精炼、开发效率高著称,并且非常重视工程化能力和规范性,比如严苛的语法格式、内置测试能力等。但是,作为一门系统级编程语言,并且内置了自动垃圾回收、协程、通道、接口、元编程等高级能力的语言,各种语言陷阱与高级使用问题仍是Go语言开发者不可忽视的内容。尤其对于使用Go语言构建基础设施平台、基础云服务、高性能中间件、高负载服务端等关键业务的开发者,更加需要重视Go语言的高级编程知识。从Go语言的多种常用数据结构如切片、结构体、字符串、映射表、管道等的使用上,到迭代器、循环、接口、协程、并发锁、异常处理等常见逻辑处理上,以及性能调优、测试、包管理、编译等工程步骤上,都会涉及各种可能会导致编码漏洞并进而引发业务风险的问题。本书汇总了大量华为一线工程师在使用Go语言进行关键业务开发过程中的实战经验总结,并以各种案例剖析和原理详解的方式为读者展现,以期对Go语言开发人员在深入学习与使用Go语言时提供一定的帮助。
作为一门开源、开放的编程语言,Go仍在快速的发展中,未来陆续会有更多的高级特性、更丰富的工具,以及更好的性能实现、更安全的编译与运行时。“工欲善其事,必先利其器”,相信《Go专家编程》能够帮助读者更加深入地掌握Go语言的各类高级特性,并在实际开发工作中避开各类陷阱,开发出高质量的代码,实现业务可信、安全。
张宇昕
华为云CTO
前言
Go语言是由Google公司开源的一门编程语言,虽然正式历史只有短短10年不到(2012年发布1.0版本),但在多个领域尤其是云计算领域得到了快速及广泛的应用。相对于C这种底层系统语言,Go语言增加了自动垃圾回收、协程、接口等现代语言中常见的高级特性,而相对于Java、Python等应用开发语言,Go语言移除或弱化了泛型、类、元编程、Lambda表达式等高级特性。Go语言因此兼备了系统级语言所需要的“轻快灵”,以及应用级语言所需要的“低门槛、高生产力”。Go语言非常适合用于云服务开发、应用服务端开发,以及在通用Linux上的部分嵌入式系统开发。
Go语言的快速发展也离不开开源社区的支持。Go语言自开源起就引发了大量开发者的关注,并且基于Go语言诞生了大批知名的开源项目,其中最引人瞩目的无疑是Kubernetes、Docker,以及托管在CNCF(云原生计算基金会)旗下的大批云原生开源项目。Go语言也因此被称为“云基础设施语言”,Google公司的Go产品负责人更是称Go语言为“云的语言”。
在笔者所在的华为公司,Go语言被作为公司级的五种指定编程语言之一(其他四种为C、C++、Java、Python),并且在华为云云原生产品研发部门作为首选编程语言。华为云目前有多达30款以上的云服务产品以Go语言为主力编程语言,并且基于Go语言制定了公司级的编程规范,以及生产级高可靠、高安全、高性能的可信编程要求。本书内容也源自笔者团队在Kubernetes、Docker等云原生开源社区,以及华为云多款云原生服务产品中的实际生产级经验总结。
本书写作目的
本书作为华为云原生技术丛书的一员,面向Go语言程序员及感兴趣的技术人员,普及与推广Go语言。
很多公司推崇“一次性把事情做对”的文化,对于编程而言,一次性写出高质量的代码就是对该文化最好的诠释。写出高质量的代码,对程序员有两点基本要求:
◎ 精通编程语言的内部实现机制;
◎ 丰富的实践经验,不断总结。
Go语言是一门非常容易上手的语言,即便是新手,通过官方文档都可以很快地熟悉其语法并运用到项目中。面对项目需求,我们不仅需要将其快速地实现出来,而且还要保证它总是能按照我们的预期运行,这就需要对编程语言有比较深入的认识。考虑到写出没有缺陷的程序是我们始终追求但永远无法实现的奢望,我们所能做的只是尽可能地减少缺陷及从缺陷中不断学习。
本书希望把笔者对Go语言的理解,以及来自云原生开源社区和公司内部的经验与广大的Go语言从业者分享,希望能帮助读者提升自身对Go语言的认识、写出高质量的代码。
本书特点
这是一本定位于Go语言进阶的书籍,主要讲解Go语言特性的实现机制,但为了照顾新手程序员,也为了循序渐进、由浅入深地展开介绍,在介绍特性前也会从基础用法讲起,所以不管是初级程序员,还是有一定编程经验的程序员,都可以是本书的读者。
了解Go语言特性最直接的做法是阅读其实现源码,但Go语言源码晦涩难懂,容易让人望而生畏。所以,如何从浩如烟海的源码中提炼出实现原理并以读者容易理解的方式描述出来就是本书的重点。
在讲解Go语言实现原理时,本书尽可能地使用源码中的数据结构,并配以适量的图文来帮助理解。除了对Go语言特性的介绍,本书还包括一些精心设计的测试题目,用于帮助读者检验自己的能力水平。此外,本书还收录了一些发生在真实项目中的陷阱案例,这些案例大都源自商业项目或开源项目,值得参考。
本书结构
本书内容涵盖常见的数据结构、控制结构、基础概念、标准库、工程工具及案例分享。
第1章和第2章主要介绍常见的数据结构,如管道、切片、map等,以及常见的控制结构,如select和range。建议读者在阅读这两章时先认真做一做每个章节的“热身题目”,以便于检测自已对相关知识点的掌握程度。
第3章和第4章主要介绍Go语言关键的概念,即协程和垃圾回收。协程机制涉及操作系统的设计,而垃圾回收涉及内存管理,都是比较复杂的知识,这两章主要介绍一些基础的概念,可作为读者进一步深入研究的引子。
第5章至第10章主要介绍常用Go语言标准库的实现原理,比如互斥锁、读写锁、context、reflect、testing、timer等。这些章节没有先后顺序之分,读者可以根据自身需求选择阅读。
第11章和第12章包含了Go语言工具链的内容,包括如何管理多个Go版本及Go Module。Go Module是Go官方提供的依赖包管理工具,其他第三方依赖包管理工具逐渐被Go Module所替代,这部分内容不仅包含如何使用Go Module,还对Go Module的实现机制做了探讨。
第13章记录了来自开源社区和实际生产级项目的部分“踩坑”案例,出于信息安全、方便叙述的考虑,笔者对这些案例做了一定程度的精简,实际项目中这些问题会非常隐蔽。虽然这些知识点在前面的章节中均有介绍,但本章还是值得阅读,因为写出高质量代码不仅需要对语言本身有深刻的理解,也需要不断吸取前人的经验。
本书援引的Go语言源码,如无特别注明,则主要源自Go 1.11,同时本书也覆盖了Go 1.12至1.14版本新增的主要特性。
表达约定
本书的讨论内容可能在不同的上下文语境下对相同的事物出现不同的表述方式,比如:
◎ 管道:有时会使用更贴近源码实现的channel甚至chan名称。
◎ 切片:有时会使用更贴近源码实现的slice名称。
◎ 上下文:有时会使用Context表示上下文接口或用于章节标题中,有时也直接使用context。
◎ 复制:往往会使用拷贝或克隆等业内相对通用的词语表示。
源代码与官方参考
本书示例代码位于https://github.com/cloudnativebooks/cloud-native-go,读者可以从此获取示例源码及运行源码的相关说明。
本书涉及的参考书目、博客文章等内容可以从www.broadview.com.cn/36557中的下载资源处获取。
勘误和支持
若您在阅读本书的过程中有任何问题或者建议,可以通过本书源码仓库提交Issue或者PR,也可以关注容器魔方微信公众号并加入微信群与作者交流。我们十分感谢并重视您的反馈,会对您提出的问题、建议进行梳理与反馈,并在本书后续版本中及时做出勘误与更新。
致谢
在本书的写作及成书过程中,本书作者团队得到了公司内外许多领导、同事、朋友及家人的鼓励和帮助。
感谢华为云郑叶来、张宇昕、高江海、李帮清、方璞等业务主管对华为云原生技术丛书及本书写作的大力支持。
感谢华为云可信软件能力团队的李新峰、彭瑞林、黄凌云,以及华为云容器团队王泽锋、毛杰、张琦、黄毽等对本书的审阅和建议。
感谢电子工业出版社博文视点陈晓猛编辑,陈编辑一丝不苟地制定出版计划及组织工作,本书才得以顺利出版。
感谢每一位Go语言布道者,他们的各种分享、博客文章及书籍都在积极推动着Go语言的发展,也为本书编写提供了灵感和参考;
任洪彩
华为云原生开源团队核心成员
刘赫伟 博士
华为云原生技术丛书 总编
华为云容器服务域 技术总监
勘误内容在哪看