引言
Go 于 2009 年公开发布,至今已有十余年。与多数编程语言相比,Go 在这些年里的变化相当克制。2012 年发布 Go 1 时,Go 团队承诺按 Go 1 规范写成的程序在该规范的整个生命周期内都能不加修改地正确编译和运行 [Go Authors, 2012]。此后加入的泛型等重大特性,都没有打破这一承诺。Go 从诞生之初就以简洁、高效并发和低开发成本为目标,这种简洁的表面之下有怎样的实现机制、这些机制如何工作,自然引人好奇。本书讨论的正是 Go 源码中的技术原理及其演进历程。
致读者
设计总在演进,源码总在变化,为什么还要花力气研究日常工作中未必会接触的源码?Russ Cox 曾这样界定软件工程 [Cox, 2018]:
| |
即:编程一旦加入时间和其他程序员,就成了软件工程。Go 的运行时与编译器正是这样一份代码,它们已经由许多人维护了十余年。阅读它们,不仅能加深对语言本身的理解,更能看清一项设计背后的基本原理,以及实现者在落实这项设计时作出的工程决策、遵循的实践和使用的技巧。代码总可以推倒重来,原理却能长久留存。
本书希望涵盖 Go 的各个方面:用户代码直接打交道的运行时组件,与关键语言特性紧密相关的工具链,以及若干重要的标准库。部分章节会讨论不同平台上的实现差异,但以 Linux/amd64 为主。
预备知识
读者应具备基本的计算机科学素养,至少学过程序设计和数据结构课程,能够自如地讨论散列表、红黑树等概念。部分章节会用到离散数学和概率论的基础知识,例如谓词与随机变量。
本书不要求读者已经熟练使用 Go。1.2 Go 语言综述 概述了 Go 的组成部分及其主要的设计决定;语言本身的系统学习,可参阅 Donovan 与 Kernighan 的《Go 程序设计语言》。当然,具备 Go 的编程经验会让阅读更加顺畅。
正文以 [Cox, 2018]这样的形式标注引用,点击即可跳到该节末尾「延伸阅读」中的对应条目。这些文献一部分是正文论述的出处,包括设计文档、提案、论文以及 Go 仓库中的具体提交;另一部分指向本书未及深入的话题,供有兴趣的读者进一步阅读。书中的术语及其英文原文汇集在术语表中。
如果担心本书的门槛,或在阅读调度、内存管理等章节时感到吃力,可以参考如何阅读本书,那里给出了按背景选择起点、难章分两遍读的建议。
关于本书的版本
本书以 Go 1.26 为基准作过一次系统的重写与校订,内容分为六个部分:全景与历史、语言特性的实现、并发、内存、编译器与工具链,以及异构计算与 AI 时代的 Go。Go 1.27 已于 2026 年 8 月发布,书中在相关之处会说明它带来的变化。每一节都尽量沿着「问题、设计、演化、取舍、实现」这条线索展开,并对照 Go 源码与一手设计文档加以核实。
即便如此,源码仍在持续演进,书中也难免有疏漏或随版本过时之处。读者若怀疑某处内容有误,欢迎在 GitHub 仓库提交 Issue 或 Pull Request,我们会持续修订。
延伸阅读
- [Cox, 2018] Russ Cox. What is Software Engineering? (Go & Versioning, Part 9). May 30, 2018. https://research.swtch.com/vgo-eng
- [Go Authors, 2012] The Go Authors. Go 1 and the Future of Go Programs. 2012. https://go.dev/doc/go1compat