Go 语言设计与实现

751 阅读4分钟
原文链接: draveness.me

Go 语言设计与实现

历史和现状

Go 语言是诞生于 2009 年的编程语言,发展到今天已经有过去了 10 多年1。目前的 Go 语言在国内外的社区都非常热门,很多著名的开源框架,例如:Kubernetes、etcd 和 Prometheus 等都使用 Go 语言开发,近年来热门的微服务架构和云原生技术也为 Go 语言社区带来了非常多的活力。

golang-banner

图 1 - Go 语言

作者目前也使用 Go 语言作为日常开发的主要语言,虽然 Go 语言没有 Lisp 系语言的开发效率和强大表达能力,但是却是一门非常容易使用并且大规模运用的工程语言,这也是作者学习和使用 Go 语言的主要原因。

作者是从 2018 年才开始学习和使用 Go 语言的,刚刚接触 Go 语言时是有些排斥和拒绝的,一度认为 Go 语言 GOPATH 的设计非常诡异,而简单的语法也导致了低下的表达能力并且影响开发效率。但是随着对 Go 语言的深入学习和理解,作者的这一观念也在不断改变。

到了今天,作者认为我们在工业界需要这么一门语法简单的编译型语言,它能够提供简单的抽象和概念,虽然目前 Go 语言也有很多问题,但是语言以及周边工具的不断完善也让作者感受到了社区的活力,也坚定地认为这门语言未来的发展会越来愈好。

为什么要写这本书

目前的市面上分析 Go 语言实现的书籍较少,多数的书籍都偏重于 Go 语言基础和实战。虽然目前有很多分析 Go 语言的博客,但是它们却都面临以下的两个问题:

  • 大量博客会成段的展示源代码的实现细节,没有提供较好的可读性;
  • 少部分博客的质量较高,它们对 Go 语言的一些模块讲解的比较深入,但是不够系统,不能形成足够丰富、完整的内容;

除了上述的这些原因之外,目前关心 Go 语言设计以及演进的博客和书籍比较罕见,然而理解 Go 语言的发展史是帮助我们深入理解语言的有效途径,我们不应该忽视这一过程。

写作理念

分析语言设计与实现的书籍不是特别的好写,很多文章都会陷入对不重要的细节,大量的篇幅都都是复制的源代码,分析介绍的过程也没有分清主次,不能提供很好的阅读体验。本书会遵循以下的一些理念为读者提供高质量的内容:

  • 通过大量配图帮助读者理解实现细节;
  • 通过历史的演进和社区讨论理解设计背后的决策和原因;
  • 删减源代码中的无关细节并给出精准到行的源码链接;
  • 提供切实可行的源码阅读方法;

作者会通过以上的不同手段帮助各位读者理解 Go 语言的设计以及实现原理。

目标读者

本书不建议没有任何编程经验的读者阅读,其目标读者包含以下几部分人群:

  • 学习过 Go 语言并且想要理解背后设计与实现的开发者;
  • 有过其他语言的开发经验,想要学习 Go 语言的开发者;

主要内容

本书的主要内容可以分成四个主要部分,分别是编译原理、运行时、基础知识和进阶知识,这四部分几乎可以覆盖 Go 语言从编译到运行的方方面面,让我们对 Go 语言有更加整体和深刻的认识。下图的思维导读中展示了本书的主要内容:

contents-mindnode

图 2 - Go 语言设计与实现主要内容

通过阅读本书,你能深入理解 Go 语言的设计与实现,包括且不仅限于以下的内容:

  • 理解编译器的词法与语法解析、类型检查、中间代码生成以及机器码生成过程;
  • 理解数组、切片、哈希表和字符串等数据结构的内部表示以及常见操作的原理;
  • 理解 Go 语言中的函数、方法以及反射等语言特性;
  • 理解常见并发原语 MutexWaitGroup 以及扩展原语的使用和原理;
  • 理解 make、new、defer、select、for 和 range 等关键字的实现;
  • 理解运行时中的调度器、网络轮询器、内存分配器、垃圾收集器的实现原理;
  • 理解 HTTP、RPC、JSON 等标准库的设计与原理;

互动与勘误

如果你对文章的内容有疑问或者想要联系作者,可以直接在本书官方网站 draveness.me/golang/ 的对应章节留言,作者会在 24 小时内回复,如果暂时无法回答问题,也会通过 👀 表情留言,感谢您的支持与帮助。


  1. What is the history of the project? golang.org/doc/faq#his… ↩︎