前言
为什么要写本书
Go是Google三位大师级人物Robert Griesemer、Rob Pike及Ken Thompson共同设计的一种静态类型、编译型编程语言。它于2009年11月正式开源,一经面世就凭借语法简单、原生支持并发、标准库强大、工具链丰富等优点吸引了大量开发者。经过十余年演进和发展,Go如今已成为主流云原生编程语言,很多云原生时代的杀手级平台、中间件、协议和应用都是采用Go语言开发的,比如Docker、Kubernetes、以太坊、Hyperledger Fabric超级账本、新一代互联网基础设施协议IPFS等。
Go是一门特别容易入门的编程语言,无论是刚出校门的新手还是从其他编程语言转过来的老手,都可以在短时间内快速掌握Go语法并编写Go代码。但很多Go初学者的疑问是:Go入门容易,但精进难,怎么才能像Go开发团队那样写出符合Go思维和语言惯例的高质量代码呢?这个问题引发了我的思考。在2017年GopherChina大会上,我以演讲的形式初次尝试回答这个问题,但鉴于演讲的时长有限,很多内容没能展开,效果不甚理想。而本书正是我对解答这个问题所做出的第二次尝试。
我这次解答的思路有两个。
- 思维层面:写出高质量Go代码的前提是思维方式的进阶,即用Go语言的思维写Go代码。
- 实践技巧层面:Go标准库和优秀Go开源库是挖掘符合Go惯用法的高质量Go代码的宝库,对其进行阅读、整理和归纳,可以得到一些能够帮助我们快速进阶的有效实践。
本书正是基于以上思路为想实现Go精进但又不知从何入手的你而写的。
首届图灵奖得主、著名计算机科学家Alan J. Perlis曾说过:“不能影响到你的编程思维方式的编程语言不值得学习和使用。”由此可见编程思维对编程语言学习和应用的重要性。只有真正领悟了一门编程语言的设计哲学和编程思维,并将其应用到日常编程当中,你才算真正精通了这门编程语言。
因此,本书将首先带领大家回顾Go语言的演进历程,一起了解Go语言设计者在设计Go语言时的所思所想,与他们产生思维上的共鸣,深刻体会那些看似随意实则经过深思熟虑的设计。
接下来,本书将基于对Go开发团队、Go社区高质量代码的分析与归纳,从项目结构和代码风格、基础语法、函数、方法、接口、并发、错误处理、测试与性能优化、标准库、工具链等多个方面,给出改善Go代码质量、写出符合Go思维和惯例的代码的箴言。
学习了本书中的这些箴言,你将拥有和Go专家一样的Go编程思维,写出符合Go惯例风格的高质量Go代码,从众多Go初学者中脱颖而出,快速实现从Go编程新手到专家的转变!
读者对象
本书主要适合以下人员阅读:
- 迫切希望在Go语言上精进并上升到新层次的Go语言初学者;
- 希望写出更符合Go惯用法的高质量代码的Go语言开发者;
- 有Go语言面试需求的在校生或Go语言求职者;
- 已掌握其他编程语言且希望深入学习Go语言的开发者。
本书特色
本书的特色可以概括为以下几点。
- 进阶必备:精心总结的编程箴言助你掌握高效Go程序设计之道。
- 高屋建瓴:Go设计哲学与编程思想先行。
- 深入浅出:原理深入,例子简明,讲解透彻。
- 图文并茂:大量图表辅助学习,重点、难点轻松掌控。
如何阅读本书
本书内容共分为十部分,限于篇幅,分为两册出版,即《Go语言精进之路:从新手到高手的编程思想、方法和技巧1》和《Go语言精进之路:从新手到高手的编程思想、方法和技巧2》。其中,第1册包含第一~七部分,第2册包含第八~十部分。
- 第一部分 熟知Go语言的一切
本部分将带领读者穿越时空,回顾历史,详细了解Go语言的诞生、演进以及发展现状。通过归纳总结Go语言的设计哲学和原生编程思维,让读者站在语言设计者的高度理解Go语言与众不同的设计,认同Go语言的设计理念。
- 第二部分 项目结构、代码风格与标识符命名
每种编程语言都有自己惯用的代码风格,而遵循语言惯用风格是编写高质量Go代码的必要条件。本部分详细介绍了得到公认且广泛使用的Go项目的结构布局、代码风格标准、标识符命名惯例等。
- 第三部分 声明、类型、语句与控制结构
本部分详述基础语法层面高质量Go代码的惯用法和有效实践,涵盖无类型常量的作用、定义Go的枚举常量、零值可用类型的意义、切片原理以及高效的原因、Go包导入路径的真正含义等。
- 第四部分 函数与方法
函数和方法是Go程序的基本组成单元。本部分聚焦于函数与方法的设计和实现,涵盖init函数的使用、跻身“一等公民”行列的函数有何不同、Go方法的本质等。
- 第五部分 接口
接口是Go语言中的“魔法师”。本部分聚焦于接口,涵盖接口的设计惯例、使用接口类型的注意事项以及接口类型对代码可测试性的影响等。
- 第六部分 并发编程
Go以其轻量级的并发模型而闻名。本部分详细介绍Go基本执行单元——goroutine的调度原理、Go并发模型以及常见并发模式、Go支持并发的原生类型——channel的惯用模式等内容。
- 第七部分 错误处理
Go语言十分重视错误处理,它有着相对保守的设计和显式处理错误的惯例。本部分涵盖Go错误处理的哲学以及在这套哲学下一些常见错误处理问题的优秀实践。
- 第八部分 测试、性能剖析与调试
Go自带强大且为人所称道的工具链。本部分详细介绍Go在单元测试、性能基准测试与性能剖析以及代码调试方面的最佳实践。
- 第九部分 标准库、反射与cgo
Go拥有功能强大且质量上乘的标准库,在多数情况下仅使用标准库即可实现应用的大部分功能,这大幅降低了学习成本以及代码依赖的管理成本。本部分详细说明高频使用的标准库包(如net/http、strings、bytes、time等)的正确使用方式,以及在使用reflect包、cgo时的注意事项。
- 第十部分 工具链与工程实践
本部分涵盖在使用Go语言进行大型软件项目开发的过程中,我们很有可能会遇到的一些工程问题的解决方法,包括使用go module进行Go包依赖管理、Go程序容器镜像、Go相关工具使用以及Go语言的避“坑”指南。
勘误和支持
由于作者水平有限,写作时间仓促,以及技术的不断更新和迭代,书中难免会存在一些错误或者不准确的地方,恳请读者批评指正。书中的源文件可以从https://github.com/bigwhite/GoProgrammingFromBeginnerToMaster下载。如果你有更多的宝贵意见,欢迎发送邮件至邮箱bigwhite.cn@aliyun.com,期待你的真挚反馈。
致谢
感谢机械工业出版社华章公司的编辑杨福川与罗词亮,在这一年多的时间里,他们的支持与鼓励让我顺利完成全部书稿。
谨以此书献给Go语言社区的关注者和建设者!
白明
2021年12月