Go 语言历史

英文原版:https://golang.design/history/,来自 Changkun Ou 及其他贡献者

此翻译文档可能更新不及时,您可以查看英文原版获得最新更新。

此文档收集了Go语言开发过程中公开的讨论及提案,以全面地展现Go语言发展历史。


免责声明

资料来源

有很多探索 Go 历史设计的平台,以下是这些平台的官方网站:

起源

Go 是由一个小组织以及语言社区的用户推动的。以下是一些核心贡献者,你可能会对他们杰出的工作感兴趣。

Go 的起源很吸引人。通过这些人举办的讲座,您可以了解到相关的口述历史和有趣的故事。

例如,您可以选择这些有关 Go 历史壮举的讲座作为起点(仅建议): talk/rob2007, talk/rob2009, talk/rob2010b, talk/rob2010d, talk/rob2011a, talk/rob2013a, talk/rob2019, talk/robert2015, talk/russ2014, steve2019b, etc.

贡献者

核心作者

Go 最初由 Rob, Robert 和 Ken 创建。Rob 跟 Robert 谈论 C++ 缓慢的编译时间, 而 Ken 刚好在隔壁办公室。之后 Ian 因为兴趣加入了这个项目,编写了 gccgo。Rob 和 Ken 退休后,Robert 和 Ian 目前为 Go 添加泛型。Russ 也是早期的核心贡献者,那时候他是谷歌的新人,Rob 在 Plan 9 项目就认识了 Russ,并邀请他加入 Go 团队。Russ 做了很多基础工作,包括早期的 Go 编译器、运行时以及 Go 1.5 启动时的巨大提升。Russ 现在是 Go 团队的 Tech Lead。

编译运行时团队

Dmitry 来自谷歌动态测试工具团队而不是 Go 团队。他编写了可伸缩的 goroutine 调度器,很多的性能提升,早期的同步,race 检测,Go 运行时阻塞分析器。Austin 在攻读博士期间是谷歌的实习生,在 Go 项目早期工作。后来,在他结束学生生涯后加入了 Go 团队,和 Rick 一起从事 Go 并发 GC 工作。他也在做抢占式调度器和链接器的工作。他现在是 Go 语言编译运行时团队的领导人。Keith 和 David 一起专注于 Go 编译器后端,尤其是当前的 SSA 后端。Michael 是 Go 团队的新成员,他的主要工作是运行时内存系统,例如内存分配器的重构和运行时指标。

仓库、工具、安全、社区

更多人和谈话应该被添加……

小组会谈

时间线

时间线能帮助你确定关联到 Go 版本文档。

版本 发布预期/实际时间 距离上一次发布天数 (+Delay)
Go 1 - / 2012.03.28 -
Go 1.1 - / 2013.05.13 440
Go 1.2 - / 2013.12.01 202
Go 1.3 - / 2014.06.18 199
Go 1.4 - / 2014.12.10 175
Go 1.5 2015.07.31 / 2015.08.19 252 (+19)
Go 1.6 2016.01.31 / 2016.02.17 182 (+17)
Go 1.7 2016.07.31 / 2016.08.15 180 (+15)
Go 1.8 2017.01.31 / 2017.02.16 185 (+16)
Go 1.9 2017.07.31 / 2017.08.24 189 (+24)
Go 1.10 2018.01.31 / 2018.02.16 176 (+16)
Go 1.11 2018.07.31 / 2018.08.24 189 (+24)
Go 1.12 2019.01.31 / 2019.02.25 185 (+25)
Go 1.13 2019.07.31 / 2019.09.03 190 (+34)
Go 1.14 2020.01.31 / 2020.02.25 175 (+25)
Go 1.15 2020.07.31 / 2020.08.11 168 (+11)
Go 1.16 2021.01.31 / 2021.02.16 189 (+16)
Go 1.17 2021.07.31 / 2021.08.16 181 (+16)
Go 1.18 2022.01.31 / 2022.03.15 196 (+43)
Go 1.19 2022.07.31 / 2022.08.02 140 (+2)
Go 1.20 2023.01.31 / 2023.02.01 183 (+1)
Go 1.21 2023.07.31 / 2023.08.08 188 (+8)
Go 1.22 2024.01.31 / 2024.02.07 184 (+7)
Go 1.23 2024.07.31 / 2024.08.14 189 (+14)

历史版本说明可以提供一些大概信息:

语言设计

Misc

切片 (1.2)

包管理 (1.4, 1.5, 1.7)

类型别名 (1.9)

Defer (1.14)

错误值 (1.13)

通道、选择器

泛型

编译工具链

编译

连接器

Ken Thompson 编写了 Go 连接器,Russ 在 Go 1.3 中进行了一些大修。Austin 和 keith, Than, Cheery 和其他人一起对连接器返工,将在 Go 1.15 和 Go 1.16 中发布

调试器

竞争检测器

跟踪器

锁分析

构建器

模块

gopls

测试,x/perf

运行时核心

调度器

执行栈

内存分配器

Go 内存分配的实力简述:Russ Cox 在 Go 1 上首次实现了基于 tcmallor 的内存分配器,mcache 缓存在 M 上。然后他修改了分配器,允许使用 16GB 的内存,后来到了128GB。然而,分配器(包括收集器)有很严重的锁竞争,且不可伸缩。在 Dmitry 的可伸缩运行时调度器后,分配器可以直接从P锁竞争中分配(更少)。同时,收集器从独立线程迁移到系统监视器线程。现在,Michael 正致力于提高内存分配器的可伸缩性,例如将收集器迁移到用户线程,基于位图的页分配器,可伸缩的 mcentral。

垃圾收集器

统计

内存模型

Go 内存模型包含以下方面:

ABI

Misc

标准库

syscall

os, io, io/fs, embed

Go 1.16 中,对新的 os/fs 包进行了大量返工和改进。 design/draft-iofs Russ Cox, Rob Pike,Go 文件系统接口——设计草案。2020年7月。

go/*

sync

Map

Pool

Mutex, RWMutex

Groups

atomic

time

context

encoding

image, x/image

以下的讨论关于颜色管理和图片标准库。现在,Go图片库不会在编码和解码期间读取或写入元信息。因此,在处理图片时(例如在非线性 sRGB 空间中缩放),颜色可能出错。通用解决方案是设计图片元数据API,来识别编码图片文件中的颜色配置文件。

Mobile

misc

未分类但相关的链接

有趣的事实

鸣谢

首先感谢 TalkGo 社区创建者 Mai Yanggolang.design 倡议的大力推动。他创建的 TalkGo 极大地改变了中国的 Go 社区。他也是一个伟大的人,积极为各种与 Go 相关的项目作贡献。

同样重要的是感谢 TalkGo 社区核心成员 qcraoeddycjy 的持续而鼓舞人心的讨论和分享。

如果没有他们的支持,此文档无法完成。

许可

golang.design/history | CC-BY-NC-ND 4.0 © changkun

Last Updated: 2024.08.18