编写本书的难度非常高,这个难度一方面来源于源码自身发展过程带来的复杂性,在编写本书的过程中代码本身也在发展。 为了让保证内容能既能跟上代码进化的速度,又要保证编写的质量,则必须在编写的过程中时刻关注那些最基本的、 最通用的和最经典的设计。
Go 语言源码的研究不仅仅局限于跟用户态代码直接相关的运行时的代码,这只是 Go 源码的一小部分。 完整理解 Go 的源码不仅需要对各方面系统理论的理解,还需要把控 Go 自身编译器与运行时之间配合,这基本上就决定了本书的起点很高; 这种复杂性还来源于各个标准库与运行时模块之间互相耦合,由于 Go 在传统程序流程之上建立了一层运行时机制, 进而会导致很多传统意义上的标准库设计变得非常的精巧。 除非某个标准库或者某个组件是纯粹的不依赖底层实现的逻辑代码,否则很少有内容能够独立成章不与其他章节产生连接, 也就为线性呈现知识的写作过程提高了难度。
除了运行时和编译器之外,书中讨论的标准库依然需要笔者在编写之前就需要对各个模块间的耦合关系相当了解, 同时也要求读者在阅读过程中时刻在脑海中勾勒这些耦合关系,也就进一步提高了阅读本书的门槛。
本书前后编写大约一年多的时间,从最初的一个关于运行时调度器的源码分析,发展到运行时代码的分析,直到现在的 甚至包含了编译器的对整个 Go 源码进行的分析。总之本书在编写过程中对本书组织结构作出的改动非常之多,但好在目前已经克服了这个困难。 回顾这个过程,期间伴随着诸多想要放弃的念头,其中一个主要的原因就是内容过于复杂,完成全书编写产生的投资回报比极低, 但如今还是坚持了下来,这少不了关注本书编写的读者的支持。
最后,笔者希望读者已经从本书收货了自己期望的知识,并深化了自身对 Go 这一语言的深入理解,理解到编写一门成功的编程语言 不仅仅需要的是系统而复杂的工程与优化知识,更需要的是对问题持续不断的思考、讨论、实践与重新设计这一工程闭环。 源码的研究虽然已经结束,但要将研究中获得的知识进一步运用到生产实践中构建更多的价值,这又将是一个全新的起点。
祝好,
欧长坤
2019 年 X 月 X 日 于 慕尼黑
Go under the hood | CC-BY-NC-ND 4.0 & MIT © changkun