《Go专家编程(第2版)》深入地讲解了Go语言常见特性的内部机制和实现方式,大部分内容源自对Go源码的分析,并从中提炼出实现原理。通过阅读本书,读者可以快速、轻松地了解Go语言的内部运作机制。
《Go专家编程(第2版)》首先介绍常见数据结构及控制结构的实现原理,包括管道、切片、Hash表、select和for-range等,这部分内容大都以几个精心准备的测验题目开头,每个测验题目均对应一个知识点,读者借此可以测验自身对该知识点的掌握程度。接着介绍了Go语言最核心的概念,包括协程的概念、协程调度模型、协程调度策略,以及内存分配和垃圾回收相关的内容。本书还介绍了测试、泛型、依赖管理等比较实用的特性。最后结合笔者的见闻,整理了一些发生在真实项目中的编程陷阱。
华为资深技术专家力作,豆瓣评分9.4,适合Go程序员面试
任洪彩
华为云原生开源团队成员,CNCF(云原生计算基金会)官方大使,Kubernetes、Karmada等项目的资深维护者。
华为员工培训中心讲师,负责Go语言培训及软件工程能力建设。
在Nokia、华为等公司参与过多个大型项目的研发与重构,对Go、C/C++、Python、Swift等语言均有深入的研究与实践。
前言
Go语言是由Google公司开源的一门编程语言,虽然历史只有10余年(2012年发布1.0版本),但在多个领域尤其是云计算领域得到了快速及广泛的使用。相对于C语言这种底层系统语言,Go语言增加了自动垃圾回收、协程、接口等现代语言中常见的高级特性,而相对于Java、Python等应用开发语言,Go语言移除或弱化了类、元编程、Lambda表达式等高级特性。Go语言因此兼备了系统级语言所需要的“轻快灵”,以及应用级语言所需要的“低门槛、高生产力”。Go语言非常适合用于云服务开发、应用服务端开发,以及在通用Linux上的部分嵌入式系统开发。
Go语言的快速发展也离不开开源社区的支持。Go语言自开源起就引发了大量开发者的关注,并且基于Go语言诞生了大批知名的开源项目,其中最引人瞩目的无疑是Kubernetes、Docker,以及托管在CNCF(云原生计算基金会)旗下的大批云原生开源项目。 Go语言也因此被称为“云基础设施语言”,谷歌的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章主要介绍常见的数据结构,如管道、slice、map等,以及常见的控制结构,如select和for-range。建议读者在阅读这两章时先认真做一做每个章节的“热身题目”,以便于检测自己对相关知识点的掌握程度。
第3章和第4章主要介绍Go语言关键的概念,即协程和内存管理。协程机制涉及操作系统的设计,而垃圾回收涉及内存管理,都是比较复杂的知识,这两章主要介绍一些基础的概念,可作为读者进一步深入研究的引子。
第5章至第10章主要介绍常用Go语言标准库的实现原理,比如互斥锁、读写锁、Context、Reflect、Testing、Timer等。这些章节没有先后顺序之分,读者可以根据自身需求选择阅读。
第11章和第12章主要介绍泛型和依赖管理,其中对依赖管理做了包括用法和实现原理的细致介绍。
第13章记录了来自开源社区和实际生产级项目的部分“踩坑”案例,出于信息安全、方便叙述的考虑,笔者对这些案例做了一定程度的精简,实际项目中这些问题会非常隐蔽。虽然这些知识点在前面的章节中均有介绍,但本章还是值得阅读的,因为写出高质量代码不仅需要对语言本身有深刻的理解,也需要不断吸取前人的经验。
本书援引的Go语言源码主要源自Go 1.11,同时本书也覆盖了Go 1.12至1.19版本新增的主要特性。
第2版修订内容
第1版出版以来,收到了大量的读者反馈,在图书不断增印过程中也修改了部分错误,在此对所有给本书提供反馈、意见和建议的读者表示感谢。
第2版基于第1版完成,除了修复第1版中的纰漏,主要有以下变化:
◎新增了Go 1.15至1.19版本新增加的主要特性,特别是1.18版本推出的泛型和Fuzzing测试。
◎新增了对sync.Map的介绍,同样重点介绍其实现原理。
◎修订了随Go语言版本演进产生的特性变更,包括Go Module中引入的retract指令,互斥锁、读写锁出现的新的方法等。
◎删减了测试相关章节,使内容更加贴近读者需要。
◎删除了Go语言版本管理章节,因为随着Go语言的普及,这部分内容略显初级。
表达约定
本书的讨论内容可能在不同的上下文语境下对相同的事物出现不同的表述方式,比如:
◎管道:有时会使用更贴近源码实现的channel甚至chan名称。
◎切片:有时会使用更贴近源码实现的slice名称。
◎上下文:有时会使用Context表示上下文接口或用于章节标题中,有时也会直接使用context。
◎复制:往往会使用拷贝或克隆等业内相对通用的词语表示。
源代码与官方参考
本书示例源码位于https://github.com/cloudnativebooks/cloud-native-go,读者可以从此获取示例源码及运行源码的相关说明。
勘误和支持
若您在阅读本书的过程中有任何问题或者建议,可以通过本书源码仓库提交Issue或者PR,也可以关注容器魔方微信公众号并加入微信群与作者交流。我们十分感谢并重视您的反馈,会对您提出的问题、建议进行梳理与反馈,并在本书后续版本中及时做出勘误与更新。
致谢
在本书的写作及成书过程中,本书作者团队得到了公司内外许多领导、同事、朋友及家人的鼓励和帮助。
感谢华为云郑叶来、张宇昕、高江海、李帮清、方璞等业务主管对华为云原生技术丛书及本书写作的大力支持。
感谢华为云可信软件能力团队的李新峰、彭瑞林、黄凌云,以及华为云容器团队王泽锋、毛杰、张琦、黄毽等对本书的审阅和建议。
感谢电子工业出版社博文视点陈晓猛编辑,陈编辑一丝不苟地制定出版计划及组织工作,本书才得以顺利出版。
感谢每一位Go语言布道者,他们的各种分享、博客文章及书籍都在积极推动着Go语言的发展,也为编写本书提供了灵感和参考。
任洪彩
华为云原生开源团队核心成员
刘赫伟 博士
华为云原生技术丛书 总编
华为云容器服务域 技术总监