Go 语言创世纪

98 阅读15分钟

前言

你是一个计划成为程序员的有志青年,在经过多次对比之后,你坚定的选择了学习 Go 语言并立志成为一名优秀的 Gopher。

你兴致勃勃地在网络上开始搜索 Go 语言的入门教程,并在学习一段时间之后有了一些疑问,比如:

  • 已经有了 Java、C++ 等优秀的开发语言,为什么还会出现 Go 语言?
  • Go 语言的前世今生是怎样的?
  • Go 语言和其他语言的区别是什么?
  • ……

在正式开始学习之前,我想要向你介绍一下 Go 语言的前世今生,以便于解决你心中的那些疑惑。

Go 语言诞生于何时?它的最初设计者是谁?它为什么会被命名为 Go?它的设计目的是什么?如今发展的怎么样?带着这些问题,我们一起穿越时空,回到 2007 年 9 月 Go 语言诞生的那一历史时刻吧。

简介

Go 语言(也称为 Golang)是由 Google 开发的一款开源编程语言。

过去,很多开发者在使用 C++ 来开发大型的服务端软件时,由于二进制文件一般都非常大,需要耗费大量的时间在编译文件上,同时编程语言的设计思想也已经非常陈旧,这些情况都充分说明了现有的编程语言已不符合时下的生产环境。

学者们呢坐下来总结出了现在生产环境与软件开发之间的矛盾,并尝试设计一门全新的编程语言来解决这些问题。他们讨论得出的对编程语言的设计要求如下:

  • 能够以更快的速度开发软件;
  • 开发出的软件能够很好地在现代的多核计算机上工作;
  • 开发出的软件能够很好地在网络环境下工作;
  • 是人们能够享受软件开发的过程。

Go 语言就在这样的环境下诞生了,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。

Go 语言出现的目的是在编程领域中创造出最实用的方式来进行软件开发。它并不是要用奇怪的语法或晦涩难懂的概念来从根本上推翻已有的编程语言,而是重建并改善了 C、C#、Java 中的许多语法风格。

起源

Go 语言的起源可以追溯到 2007 年。

在 2007 年的时候,谷歌开发工作的规模与正在部署的生产系统规模暴增,需要有个好的解决方案应对这些挑战。

当时 Robert Griesemer、Rob Pike 和 Ken Thompson 都是用的 C++,编译一个分布式集群大概要花费 45 分钟,这个过程让三个人都很难以忍受。

2007 年 9 月 20 日星期四下午,在等待编译的时候 Rob Pike 把 Robert Griesemer 和 Ken Thompson 喊到一起决定要做些什么:他们不想永远使用 C++,并且想要很好处理并发的问题。希望创造一个能够摒弃其他语言的缺点的新语言,保持静态类型和运行时效率、具有可读性和可用性、具备高性能网络和并发处理。

Go 这个名字是 Rob Pike 取的,认为它很短、易于输入,非常合适这一新语言的特性。

最初的一周内,他们就讨论出来了很多 Go 语言的风格和特性,并着手开发。

经过两年的努力,于 2009 年 11 月,Google 宣布了 Go 语言的首个公开发布版本,即 Go 1。

顶级的初创团队:

① Robert Griesemer,参与开发 Java HotSpot 虚拟机,并负责 Chrome 浏览器和 Node.js 使用的 Google V8 JavaScript 引擎的代码生成部分。

② Rob Pike,Go 语言项目总负责人,贝尔实验室 Unix 团队成员,参与的项目包括 Plan 9,Inferno 操作系统和 Limbo 编程语言。

③ Ken Thompson,贝尔实验室 Unix 团队成员,C 语言、Unix 和 Plan 9 的创始人之一,与 Rob Pike 共同开发了 UTF-8 字符集规范。

随着更多有才华的程序员加入到 Go 开发团队中,更多贡献者开始为 Go 语言项目添砖加瓦。使得 Go 在发布的当年就成为了著名编程语言排行榜 TIOBE 的年度最佳编程语言。

Go 发布后就吸引了一些公司,尤其是云计算领域的初创公司成为了 Go 语言的早期接纳者。在经过若干年的磨合后,在这些公司中诞生了不乏像 Docker(容器引擎)、Kubernetes(云原生事实标准平台)、Ethereum(区块链公链以太坊)等“杀手级”或示范性项目,这些项目也让 Go 被誉为云计算基础设施新兴语言或直接称为云计算语言

Go 在近些年云原生领域的广泛应用也让其跻身云原生时代的头部编程语言。

Logo 的诞生

在 Go 立项的时候,Rob Pike 的妻子 Renee French(著名美国插画师、漫画家和作家,以其独特的风格和奇特的创意而闻名)就帮他们画了一个标志,然后这个图标就出现在 Google Code 网站和第一件 Go T 恤上,该 Logo 被用来体现 Go 的速度。

2009 年 11 月 10 日 Go 准备开源发布的之前,Rob Pike 的妻子建议,将她在 1999 年左右为新泽西州 WFMU 广播电台年度筹款活动设计的,作为宣传的形象,改编成为 Go 的吉祥物 ------ Gopher(地鼠)。

放错了,应该是这个才对 ~(~ ̄▽ ̄)~:

之后,Rob Pike 的妻子又绘制了更多的 Go gopher 形象,代表着 Go 项目和各地的 Go 程序员。这些可爱的形象成为 Go 世界中最受欢迎的事物之一,被世界各地的 Go 程序员广泛使用。

发展

  1. 初期版本(2009 年 - 2012 年):初期版本的 Go 语言主要集中于提供简洁、高效的编程体验,以及强大的并发支持。这些特性使其成为了云服务、网络应用和大规模分布式系统开发的理想选择。
  2. Go 1 发布(2012 年):Go 1 是 Go 语言的首个稳定版本,也是第一个被广泛用于生产环境的版本。发布 Go 1 的目标是提供稳定的 API 和 ABI,以便未来版本的兼容性。
  3. 生态系统的发展(2012 年 - 至今):随着 Go 语言的发展,其生态系统也在不断壮大。包括标准库、第三方库、框架以及工具链在内的生态系统都得到了极大的丰富和改进,使得 Go 语言更加适用于各种类型的应用开发。
  4. Go 语言在工业界的应用(2010 年至今):自从 Go 语言发布以来,越来越多的公司和组织开始采用 Go 语言进行开发。一些知名的公司,如 Google、Uber、Dropbox、Docker、Cloudflare、MongoDB 等,都在生产环境中使用 Go 语言开发核心系统。
  5. 版本更新和改进(2012 年至今):Go 语言的开发团队持续不断地发布新的版本,以改进语言的性能、稳定性和功能。Go 社区也积极参与到语言的发展中,提出改进建议、修复 bug,并贡献各种开源项目。

官网发布历史

特性

  1. 简单易学

Go 语言的语法设计简洁明了,摒弃了一些繁琐的特性和语法元素,使得代码更易于阅读和维护。这使得 Go 语言成为一门学习曲线较为平缓的编程语言,即使是没有编程经验的人也能相对轻松地上手。

  1. 高性能并发

Go 语言天生支持并发编程,通过 goroutinechannel 机制,使得并发编程变得非常简单。

传统编程语言(如 C、C++ 等)的并发实现,实际上就是基于操作系统调度的,即程序负责创建线程(一般通过 pthread 等函数库调用实现),操作系统负责调度。这种传统支持并发的方式主要有两大不足:复杂与难于扩展。

为了解决这些问题,Go 果断放弃了传统的基于操作系统线程的并发模型,而采用了用户层轻量级线程或者说是类协程(coroutine),Go 将之称为 goroutine

goroutine 占用的资源非常少,Go 语言运行时默认为每个 goroutine 分配的栈空间仅 2KB,会自动在配置的一组逻辑处理器上调度执行 goroutine。每个逻辑处理器绑定到一个操作系统线程上。这让用户的应用程序执行效率更高,而开发工作量显著减少。

goroutine 调度的切换也不用陷入(trap)操作系统内核层完成,代价很低。因此,在一个 Go 程序中可以创建成千上万个并发的 goroutine。所有的 Go 代码都在 goroutine 中执行,哪怕是 Go 的运行时代码也不例外。

channel则提供了不同 goroutine 之间的通信和同步机制,使得编写并发代码变得直观而安全,可以帮助用户避免在其他语言里常见的共享内存访问的问题。

  1. 快速编译

Go 语言的编译速度非常快,这得益于先进的编译器和优化器。快速的编译速度可以大大提高开发效率,特别是在大型项目中。

  1. 内存管理

Go 语言拥有自动内存管理功能,也就是垃圾回收机制。这意味着开发者不需要手动管理内存分配和回收,大大减轻了编程的负担,同时也有助于防止内存泄露。

  1. 静态类型语言

Go 语言是一门静态类型的编程语言,这意味着在编译期间就能捕获到一些类型相关的错误。静态类型检查有助于提前发现潜在的 Bug,减少在运行时可能出现的错误。

  1. 跨平台支持

Go 语言的编译器可以在多种平台上运行,可以轻松地将 Go 程序编译成适用于不同操作系统和硬件架构的可执行文件。这使得 Go 语言成为跨平台开发的理想选择。

  1. 强调并遵循软件工程原则

Go 语言鼓励开发者编写清晰、简洁、可维护的代码。它有一套明确的代码风格规范,并自带了一些工具来帮助开发者保持一致的代码风格。

  1. 丰富的标准库

Go 语言附带了丰富而强大的标准库,覆盖了网络、文件处理、加密、并发等方面。开发者可以直接使用标准库提供的功能,而无需引入大量的第三方库。

  1. 工具链

完整的工具链对于日常开发极为重要。Go 在此做得相当不错,无论是编译、格式化、错误检查、帮助文档,还是第三方包下载、更新都有对应的工具。其功能未必完善,但起码算得上简单易用。内置完整测试框架,其中包括单元测试、性能测试、代码覆盖率、数据竞争,以及用来调优的 pprof,这些都是保障代码能正确而稳定运行的必备利器。除此之外,还可通过环境变量输出运行时监控信息,尤其是垃圾回收和并发调度跟踪,可进一步帮助我们改进算法,获得更佳的运行期表现。

  1. 文档资源

Go 语言拥有丰富的官方文档资源,包括语言规范、标准库文档、命令行工具说明等。此外,Go 语言社区中也有许多优秀的教程、博客和论坛,为开发者提供了学习和交流的平台。

性能测评

以下是 Go 语言与其他编程语言的对比测试数据(源于网络资料):

  • 在相同的环境和执行目标的情况下,Go 程序比 Java 或 Scala 应用程序要快上 2 倍,并比这两门语言使用少占用 70% 的内存,执行效率大约比 C++ 慢 20%;
  • Go 的编译速度要比绝大多数语言都要快,比 Java 和 C++ 快 5 至 6 倍,比 Scala 快 10 倍;
  • Go 语言通过垃圾回收器自动管理内存,这在某些情况下可能会引入一些运行时开销。相比之下,C/C++ 需要手动管理内存,这可能会导致内存泄漏和悬挂指针等问题;
  • Go 和 Python 在一般开发的平均水平测试中,Go 要比 Python 3 快 25 倍左右,少占用三分之二的内存,但比 Python 大概多写一倍的代码,毫无疑问,开发效率上,Python 是要技高一筹的;
  • 比较 Go 和 Python 在简单的 web 服务器方面的性能,单位为传输量每秒:
    原生的 Go net/http 包要比 web.py 快 7 至 8 倍,如果使用 web.go 框架则稍微差点,比 web.py 快 6 至 7 倍。如果是使用Python 中的 tornado 异步服务器和框架开发出的Web应用,那么要比传统的 web.py 快很多,此时,Go 大概只比它快 1.2 至 1.5 倍,Go 在 Web 开发的领域比 Python 要快,但目前来看,并非碾压态势。

业务方向

  1. 网络编程:Go 语言原生支持高效的并发编程,因此非常适合用于构建网络应用程序和分布式系统。
  2. 大数据处理:Go 语言具有高效的执行性能和并发处理能力,因此很适合用于处理大量数据。
  3. 云原生开发:随着云原生应用的兴起,Go 语言也成为云原生开发的热门选择。Go 的快速启动时间、小内存占用和高并发性能使其非常适合在云环境中构建轻量级容器化应用和无服务器函数。
  4. 微服务:Go 语言对于构建微服务和 API 很有优势,因为它的代码结构简单,易于维护,同时具有高效和高并发特性
  5. 数据库和存储系统:Go 语言提供了丰富的数据库和存储库,包括 SQL 数据库(如 MySQL、PostgreSQL)、NoSQL 数据库(如 MongoDB、Redis)以及分布式存储系统(如 etcd)。这使得 Go 成为开发高性能、可扩展和可靠的数据存储解决方案的理想语言。
  6. Web 开发:Go 语言拥有轻量级的 HTTP 服务器,使其成为构建高性能 Web 应用程序的理想选择。它支持快速开发和部署,并且具有良好的性能和可靠性。很多人使用 Golang 是因为它非常快,而且它可以用来并行运行进程,这样他们就不必互相等待。它内置了对并发的支持,并促进了单个进程中线程和处理器之间的并行性。这可以使你的网站更容易快速加载并为你提供最佳的用户体验。
  7. 区块链开发:Go 语言在区块链开发领域也得到了广泛应用。许多知名的区块链项目(如 Ethereum)使用 Go 语言作为其主要开发语言,因为 Go 具有高效的并发能力和良好的性能,适合处理区块链交易和智能合约。

结语

简单是 Go 语言贯穿语言设计和应用的主旨设计哲学。德国建筑大师路德维希·密斯·凡德罗将“少即是多”这一哲学理念应用到建筑设计当中后取得了非凡的成功,而 Go 语言则是这一哲学在编程语言领域为数不多的践行者。“少”绝不是目的,“多”才是其内涵。Go 在语言层面的简单让它收获了不逊于 C++/Java 等的表现力的同时,还获得了更好的可读性、更高的开发效率等在软件工程领域更为重要的元素。

“高内聚、低耦合”是软件开发领域亘古不变的管理复杂性的准则。Go 在语言设计层面也将这一准则发挥到极致。Go 崇尚通过组合的方式将正交的语法元素组织在一起来形成应用程序骨架,接口就是在这一哲学下诞生的语言精华。

来自 Go 语言之父的忠告

Rob Pike 今年已经 68 岁了,大部分时候在澳大利亚生活,现在居住在悉尼新南威尔士州。

在最近的一次采访中,他总结了自己 40 多年开发经验说:避免倦怠的最好方法是在支持你的环境中做你真正喜欢的事情。他认为自己是幸运的,在贝尔实验室和谷歌都是如此。

同时他也提醒我们:如果对工作感到压力,应该随时休息或者改变方向