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