本书基于Go语言源码提炼出Go特性的实现原理,并配以大量图表和实例以通俗易懂的语言描述出来,包括常见数据结构实现原理(包括chan、slice、map、struct等),常见控制结构实现原理(包括defer、select、range、mutex等),Go协程、内存管理、反射等机制,Go 工具链指导及原理(包括单元测试、性能测试、依赖管理等)。另外,本书还包括由实际项目Bug复盘而来的案例分享,包括定时器资源泄露、语法糖陷阱等。本书还包含大量练习题目,甚至可以作为面试题目来源。
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语言特性的介绍,本书还包括一些精心设计的测试题目,用于帮助读者检验自己的能力水平。此外,本书还收录了一些发生在真实项目中的陷阱案例,这些案例大都源自商业项目或开源项目,值得参考。
本书结构
本书内容涵盖常见的数据结构、控制结构、基础概念、标准库、工程工具及案例分享。
□□章和第2章主要介绍常见的数据结构,如管道、切片、map等,以及常见的控制结构,如select和range。建议读者在阅读这两章时先认真做一做每个章节的“热身题目”,以便于检测自已对相关知识点的掌握程度。
第3章和第4章主要介绍Go语言关键的概念,即协程和垃圾回收。协程机制涉及操作系统的设计,而垃圾回收涉及内存管理,都是比较复杂的知识,这两章主要介绍一些基础的概念,可作为读者进一步深入研究的引子。
第5章至□□0章主要介绍常用Go语言标准库的实现原理,比如互斥锁、读写锁、context、reflect、testing、timer等。这些章节没有先后顺序之分,读者可以根据自身需求选择阅读。
□□1章和□□2章包含了Go语言工具链的内容,包括如何管理多个Go版本及Go Module。Go Module是Go官方提供的依赖包管理工具,其他第三方依赖包管理工具逐渐被Go Module所替代,这部分内容不仅包含如何使用Go Module,还对Go Module的实现机制做了探讨。
□□3章记录了来自开源社区和实际生产级项目的部分“踩坑”案例,出于信息安全、方便叙述的考虑,笔者对这些案例做了一定程度的精简,实际项目中这些问题会非常隐蔽。虽然这些知识点在前面的章节中均有介绍,但本章还是值得阅读,因为写出高质量代码不仅需要对语言本身有深刻的理解,也需要不断吸取前人的经验。
本书援引的Go语言源码,如无特别注明,则主要源自Go 1.11,同时本书也覆盖了Go 1.12至1.14版本新增的主要特性。
勘误和支持
若您在阅读本书的过程中有任何问题或者建议,可以通过本书源码仓库提交Issue或者PR,也可以关注容器魔方微信公众号并加入微信群与作者交流。我们十分感谢并重视您的反馈,会对您提出的问题、建议进行梳理与反馈,并在本书后续版本中及时做出勘误与更新。
致谢
在本书的写作及成书过程中,本书作者团队得到了公司内外许多领导、同事、朋友及家人的鼓励和帮助。
感谢华为云郑叶来、张宇昕、高江海、李帮清、方璞等业务主管对华为云原生技术丛书及本书写作的大力支持。
感谢华为云可信软件能力团队的李新峰、彭瑞林、黄凌云,以及华为云容器团队王泽锋、毛杰、张琦、黄毽等对本书的审阅和建议。
感谢电子工业出版社博文视点陈晓猛编辑,陈编辑一丝不苟地制定出版计划及组织工作,本书才得以顺利出版。
感谢每一位Go语言布道者,他们的各种分享、博客文章及书籍都在积极推动着Go语言的发展,也为本书编写提供了灵感和参考;
任洪彩
华为云原生开源团队核心成员
刘赫伟 博士
华为云原生技术丛书 总编
华为云容器服务域 技术总监
华为云原生团队核心成员,开源爱好者,深度参与CNCF(云原生计算基金会)旗下Kubernetes、Prometheus等项目贡献,Kubernetes资深成员,担任Kubernetes SIG-Instrumentation Approver,敏捷软件思想深度实践者,在Nokia、华为等公司参与过多个大型项目的研发与重构,对Go、C/C++、Python、Swift等语言均有深入的研究与实践。