前言
Go语言虽然是一门非常年轻的语言(2009年正式开源),却以不可思议的速度在成长着。
顶级大公司(谷歌)的支持、顶尖的设计者(罗勃·派克、肯·汤普逊)和豪华的开发团队、“杀手级”的项目(Kubernetes)、开放活跃的社区以及数以百万计的开发者都揭示了Go语言的巨大潜力。在国内,Go语言良好的发展趋势可以从招聘网站中数量庞大的岗位需求以及每天发表在各种媒体上的种类繁多的相关文章中得到印证。
在可预见的未来,相信Go语言还将延续强劲的发展势头。为了把握和适应时代的需求,开发者需要在短时间内掌握Go这门语言。虽然高级语言足够抽象,在大部分情况下掌握了基本的语法就可以创建庞大和复杂的项目,但是仍然需要遵守一定的规则才能写出正确、优雅、容易维护的代码。当程序的执行结果不符合预期时,我们是否有足够多的手段去调试?很显然,会使用和能用好有本质的区别,充分的经验、合理的架构、遵守软件设计规范、使用经典的设计模式、规避常见的错误陷阱、强制性工具检查都能够帮助开发者写出更好的程序。然而很多时候我们并不满足于此,还希望探究语言背后的原理。
Go语言的编译器、运行时,本身就是用Go语言写出的既复杂又精巧的程序;探究语言设计、语法特性,本身就是学习程序设计与架构、数据结构与算法等知识的绝佳途径。学习底层原理能够帮助我们更好地了解Go语言的语法,做出合理的性能优化,设计科学的程序架构,监控程序的运行状态,排查复杂的程序异常问题,开发出检查协程泄露、语法等问题的高级工具,理解Go语言的局限性,从而在不同场景下做出合理抉择。学习Go语言底层原理能提升自己的专业技能和薪资水平,这种学习本身也是一种乐趣,而这种乐趣恰恰是很多自上而下学习编程语言的开发者不能体会的。
目前市面上鲜有系统介绍Go语言底层实现原理的书籍,为了弥补这个缺陷,笔者写作本书,系统性地介绍Go语言在编译时、运行时以及语法特性等层面的底层原理和更好的使用方法。本书由21章组成,这21章可以分为6部分。
第1~8章为第1部分,介绍Go语言的基础——编译时及类型系统。包括浮点数、切片、哈希表等类型以及类型转换的原理。
第9~11章为第2部分,介绍程序运行重要的组成部分——函数与栈。包括栈帧布局、栈扩容、栈调试的原理,并介绍了延迟调用、异常与异常捕获的原理。
第12、13章为第3部分,介绍Go语言程序设计的关键——接口。包括如何正确合理地使用接口构建程序、接口的实现原理和可能遇到的问题,并探讨了接口之上的反射原理。
第14~17章为第4部分,介绍Go语言并发的核心——协程与通道。详细论述了协程的本质以及运行时调度器的调度时机与策略。介绍了通过通信来共享内存的通道本质以及通道的多路复用原理,并探讨了并发控制、数据争用问题的解决办法及锁的本质。
第18~20章为第5部分,介绍Go语言运行时最复杂的模块——内存管理与垃圾回收。详细论述了Go语言中实现内存管理方法及垃圾回收的详细步骤。
第21章为第6部分,介绍Go语言可视化工具——pprof与trace。详细论述了通过工具排查问题、观察系统运行状态的方法与实现原理。
为了准确地论述每一个话题,笔者参阅了市面上能够找到的文章、提案并详细参考了相应的源代码。从某种意义上来讲,这是一本站在巨人肩膀上的著作。学习原理是为了更好地使用,笔者在本书中不会粘贴大段的源码,而是将其充分整理并结合了作者的思考后用图和例子的形式来讲解。相信当读者阅读完本书后能够建立一整套底层原理模型并对程序有不一样的体会,就像清晰地看到了Go程序中的每一根血管和每一个细胞一样。
本书各章参考资料可通过微信扫描封底二维码获取。
郑建勋
2021年5月