此系列文章主要用来记录自己学习 Go 语言的点点滴滴,在这个系列中,我将介绍 Go 语言相关的基础知识,探讨其独特的特性,实践编写 Go 程序,并深入理解 Go 的性能优化和最佳实践。
在这里,希望学习或者使用 Go 语言的小伙伴,也能够参与到我的学习旅程中来,希望每一位小伙伴不仅仅只是作为阅读者,还可以提问、分享你的见解,对我的内容进行反馈。因为我深信,真正的学习是相互的,让我们携手走进 Go 语言的世界,一起学习,一起成长,期待我们在 Go 语言的道路上共同前行。
本文主要包含以下内容:
- 为什么需要一门新的语言
- Go 语言基本介绍
- Go 的发展历程
- Go 应用领域
为什么需要一门新的语言
编程语言已经非常多,偏性能敏感的编译型语言有 C、C++、Java、C#、Delphi 和 Objective-C 等,偏快速业务开发的动态解析型语言有 PHP、Python、Perl、Ruby、JavaScript 和 Lua 等,面向特定领域的语言有 Erlang、R 和 MATLAB 等。
那么我们为什么需要 Go 这样一门新语言呢?
在 2000 年前的单机时代,C 语言是编程之王。随着机器性能的提升、软件规模与复杂度的提高,Java 逐步取代了 C 的位置。尽管看起来 Java 已经深获人心,但 Java 编程的体验并未尽如人意。
历年来的编程语言排行榜显示,Java 语言的市场份额在逐步下跌,并趋近于 C 语言的水平,显示了这门语言后劲不足。
(图为 TIOBE 官网的编程语言排行趋势图)
Go 语言官方自称,之所以开发 Go 语言,是因为“近 10 年来开发程序之难让我们有点沮丧”。这一定位暗示了 Go 语言希望取代 C 和 Java 的地位,成为最流行的通用开发语言。
Go 希望成为互联网时代的 C 语言。多数系统级语言(包括 Java 和 C#)的根本编程哲学来源于 C++,将 C++ 的面向对象进一步发扬光大。
但是 Go 语言的设计者却有不同的看法,他们认为 C++ 真的没啥好学的,值得学习的是 C 语言。C 语言经久不衰的根源是它足够简单。因此,Go 语言也要足够简单!
那么,互联网时代的 C 语言需要考虑哪些关键问题呢?
首先,并行与分布式支持。多核化和集群化是互联网时代的典型特征。作为一个互联网时代的 C 语言,必须要让这门语言操作多核计算机与计算机集群如同操作单机一样容易。
其次,软件工程支持。工程规模不断扩大是产业发展的必然趋势。单机时代语言可以只关心问题本身的解决,而互联网时代的 C 语言还需要考虑软件品质保障和团队协作相关的话题。
最后,编程哲学的重塑。计算机软件经历了数十年的发展,形成了面向对象等多种学术流派。什么才是最佳的编程实践?作为互联网时代的 C 语言,需要回答这个问题。
Go 语言基本介绍
在上述背景下,谷歌公司于 2009 年推出了新一代的编程语言 Go。
提起 Go 语言的出身,我们就必须将我们饱含敬意的眼光投向持续推出惊世骇俗成果的贝尔实验室。
(图为贝尔实验室)
贝尔实验室已经走出了多位诺贝尔奖获得者,一些对于现在科技至关重要的研究成果,比如晶体管、通信技术、数码相机的感光元件 CCD 和光电池等都源自贝尔实验室。该实验室在科技界的地位可想而之,是一个毫无争议的科研圣地。
这里我们重点介绍一下贝尔实验室中一个叫计算科学研究中心的部门对于操作系统和编程语言的贡献。
回溯至 1969 年,肯.汤姆逊(Ken Thompson)和丹尼斯.里奇(Dennis Ritchie)在贝尔实验室的计算科学研究中心里开发出了 Unix 这个大名鼎鼎的操作系统,还因为开发 Unix 而衍生出了一门同样赫赫有名的编程语言:C 语言。
对于很大一部分人而言,Unix 就是操作系统的鼻祖,C 语言也是计算机课程中最广泛使用的编程语言。
Unix 和 C 语言在过去的几十年以来已经造就了无数的成功商业故事,比如曾在 90 年代如日中天的太阳微系统(Sun MicroSystems),现在正如日中天的苹果的 Mac OS X 操作系统其实也可以认为是 Unix 的一个变种(FreeBSD)。
虽然已经取得了如此巨大的成就,贝尔实验室的这几个人并没有因此而沉浸在光环中止步不前,他们从 20 世纪 80 年代又开始了一个名为 Plan 9 的操作系统研究项目,目的就是解决 Unix 中的一些问题,发展出一个 Unix 的后续替代系统。
在之后的几十年中,该研究项目又演变出了另一个叫 Inferno 的项目分支,以及一个名为 Limbo 的编程语言。
Limbo 是用于开发运行在小型计算机上的分布式应用的编程语言,它支持模块化编程,编译期和运行时的强类型检查,进程内基于具有类型的通信通道,原子性垃圾收集和简单的抽象数据类型。它被设计为:即便是在没有硬件内存保护的小型设备上,也能安全运行。
Limbo 语言被认为是 Go 语言的前身,不仅仅因为是同一批人设计的语言,而是 Go 语言确实从 Limbo 语言中继承了众多优秀的特性。
贝尔实验室后来经历了多次的动荡,包括肯.汤姆逊在内的 Plan 9 项目原班人马加入了 Google。在 Google,他们创造了 Go 语言。
早在 2007 年 9 月,Go 语言还是这帮大牛的 20% 自由时间的实验项目。幸运的是,到了 2008 年 5 月,Google 发现了 Go 语言的巨大潜力,从而开始全力支持这个项目,让这批人可以全身心投入 Go 语言的设计和开发工作中。
Go 语言的第一个版本在 2009 年 11 月正式对外发布,并在此后的两年内快速迭代,发展迅猛。第一个正式版本的 Go 语言于 2012 年 3 月 28 日正式发布,让 Go 语言迎来了第一个引人瞩目的里程碑。
基于 Google 对开源的一贯拥抱态度,Go 语言也自然而然地选择了开源方式发布,并使用 BSD 授权协议。任何人可以查看 Go 语言的所有源代码,并可以为 Go 语言发展而奉献自己的力量。
Google 作为 Go 语言的主推者,并没有简简单单地把语言推给开源社区了事,它不仅组建了一个独立的小组全职开发 Go 语言,还在自家的服务中逐步增加对 Go 语言的支持,比如对于 Google 有战略意义的云计算平台 GAE(Google AppEngine)很早就开始支持 Go 语言了。
按目前的发展态势,在 Google 内部,Go 语言有逐渐取代 Java 和 Python 主流地位的趋势。在 Google 的更多产品中,我们将看到 Go 语言的踪影,比如 Google 最核心的搜索和广告业务。
下面我们再来看看Go语言的主要作者。Go 语言的出身可以说非常的豪华,主要开发者有:
-
肯.汤姆逊(Ken Thompson):图灵奖得主,Uinx 之父,B 语言(C 语言前身)以及 C 语言作者,还做飞行员,后来被谷歌挖走。
-
罗布.派克(Rob Pike):Unix 小组的成员,参与 Plan9 和 Inferno 操作系统,参与 Limbo 和 Go 语言的研发,《Unix 编程环境》作者之一。
-
罗伯特.格里泽默(Robert Griesemer):在开发 Go 之前,是 Java 的 HotSpot JVM 编译器,以及 Chrome 浏览器的 V8 引擎的主要贡献者。
-
拉斯.考克斯(Russ Cox):参与 Plan9 操作系统的开发,Google Code Search 项目负责人。
-
伊安.泰勒(Ian Lance Taylor):GCC 社区的活跃人物,gold 连接器和 GCC 过程间优化 LTO 的主要设计者,Zembu 公司的创始人。
-
布拉德.菲茨帕特里克(Brad Fitzpatrick):LiveJournal 的创始人,著名开源项目 memcached 的作者。
虽然我们这里只列出了一部分,大家已经可以看出这个语言开发团队空前强大,这让我们在为 Go 语言的优秀特性而兴奋之外,还非常看好这门语言的发展前景。
Go 语言作为一门全新的静态类型开发语言,与当前的开发语言相比具备众多令人兴奋不已的新特性。
有人形容 Go 语言为 Go = C + Python,说明 Go 语言既有 C 静态语言程序的运行速度,又能达到 Python 动态语言的快速开发。Go 语言最主要的特性:
-
自动垃圾回收
-
更丰富的内置类型
-
函数多返回值
-
错误处理
-
匿名函数和包
-
类型和接口
-
并发编程
-
反射
-
语言交互性
针对上面所列举的诸多特性,这里简单介绍几个:
1. 自动垃圾回收
C/C++ 最头疼的就是指针问题,一不小心就野指针了或者又越界了。在 Go 语言里再也不用担心,也不用考虑 delete 或者 free,系统自动会回收。
2. 函数可以返回多个值
这个很神奇,大多数语言只能返回一个值,Go 语言可以返回多个值。这个功能使得开发者再不用绞尽脑汁的想到底怎么返回值的设计,也不用为了传值专门定义一个结构体。
3. 并发编程
Go 语言天然并发,只需要关键字 go 就可以让函数并发执行,使得并发编程变得更为简单,这也是 Go 语言最大的优势。
4. 更丰富的内置类型
除了几乎所有语言都支持的简单内置类型(比如整型和浮点型等)外,Go 语言也内置了一
些比较新的语言中内置的高级类型,比如 C# 和 Java 中的数组和字符串。除此之外,Go 语言还内置了一个对于其他静态类型语言通常用库方式支持的字典类型 map。
Go 语言设计者对为什么内置 map 这个问题的回答也颇为简单:既然绝大多数开发者都需要用到这个类型,为什么还非要每个人都写一行 import 语句来包含一个库?
这也是一个典型的实战派观点,与很多其他语言的学院派气息迥然不同。
另外有一个新增的数据类型:数组切片 Slice。我们可以认为数组切片是一种可动态增长的数组。这几种数据结构基本上覆盖了绝大部分的应用场景。
当然,关于 Go 语言的语言特性,还有很多很多,这里不做一一解释。在后面学习到对应新特性时,自然会有更深的体会。
Go 的发展历程
整个 Go 语言的发展历程如下:
-
2007 年,谷歌工程师肯.汤姆逊(Ken Thompson)、罗布.派克(Rob Pike)和罗伯特.格里泽默(Robert Griesemer)开始设计一门全新的语言,这是 Go 语言的最初原型。之后 Ian Lance Taylor、Russ Cox 加入项目。
-
2009 年 11 月 10 日,谷歌将 Go 语言以开放源代码的方式向全球发布。
-
在 2012 年早些时候发布了 Go 1.0 稳定版本。此时 Go 的开发已经是完全开放的,并且拥有一个活跃的社区。
-
2015 年 8 月 19 日,Go 1.5 版发布,这个版本被认为是历史性的。完全移除 C 语言部分,使用 Go 编译 Go,少量代码使用汇编实现。另外,他们请来了内存管理方面的权威专家 Rick Hudson,对 GC 进行了重新设计,支持并发 GC,解决了一直以来广为诟病的 GC 时延(STW)问题。并且在此后的版本中,又对 GC 做了更进一步的优化。
-
2017 年 2 月 17 日,Go 语言 Go 1.8 版发布。该版本在相同业务场景下的 GC 时延已经可以从 go1.1 的数秒,控制在 1ms 以内。GC 问题的解决,可以说 GO 语言在服务端开发方面,几乎抹平了所有的弱点。
-
2016 年,Go 被软件评价公司 TIOBE 选为“TIOBE 2016 年最佳语言”。
-
2017 年 8 月 24 日,Go 语言 Go 1.9 版发布。
-
2018 年 2 月 16 日,Go 语言 Go 1.10 版本发布。在稍后的 2018 年 8 月份,发布的 Go.1.11 版本启用了 module 模块概念,更加方便生产开发中使用管理了。
截止到目前写这篇文章时,最新的版本号为 go1.21。
Go 应用领域
那么,Go 语言具体能做什么样的开发呢?或者说有着什么样的应用场景呢?
由于 Go 语言,具备了 Python 的简易性和传统 C++ 和 Java 的性能,可帮助开发人员构建可伸缩的应用程序,它的应用场景横跨目前互联网中非常热门的几个领域,比如分布式/云计算、微服务、大数据、区块链、大型游戏服务端开发和物联网等。
下面列举几个 Go 语言常见的应用领域。
云平台
云服务很多都是采用 Go 进行开发,比如国内著名的七牛云是全站采用 Go 开发。还有如盛大 CDN、阿里云 CDN 等。
而且云平台基础设施如 docker、kubernetes 等也是 Go 开发的。
区块链技术
目前有一种说法,很多技术从业人员把 Go 语言称之为区块链行业开发语言。如果大家学习区块链技术的话,就会发现现在很多很多的区块链系统和应用都是采用 Go 进行开发的。
比如当前两个主流的区块链框架,分布式记账本框架 hyperledger 和以太坊合约框架 go-ehtereum 都是使用 Go 开发。
Web 游戏服务器
曾经的 Web 领域主要是 Java、C# 和 PHP 这三大语言。而现在基本每种语言都有自己完善的 Web 生态。
Go 也是如此,标准库已经自带成熟简单的 net/http 包。而且 Go 的主流 Web 开发框架也有很多,例如 gin、beego、iris 等。
目前在国内互联网大厂中,头条、滴滴都已经开始大规模采用 Go 做开发,美团目前在中间件上也开始逐渐使用 Go。
分布式/云计算
诸如数据库中间件、分布式存储、代理服等项目很多是采用 Go 开发的,例如 cockroachDB、etcd 等。
京东云消息推送系统、云存储以及 360 的推送服务等都是使用 Go 做开发。
包括知乎现在也使用 Go 来重构自己的推荐系统,还曾发表了一篇文章《舍弃 Python,为什么知乎选用 Go 重构推荐系统?》
文章地址:www.infoq.cn/article/ur3…
微服务
现在越来越多新的项目采用微服务架构,很多优秀的项目 git-kit、go-micro 都是使用 Go 开发的微服务框架。
举一些具体公司的例子。
比如今日头条,2017 的一篇文章《今日头条使用 Go 构建了千万级服务》,其中说到有 80% 的流量都跑在 Go 上,其中头条还开发了自己的一套微服务框架。还有 B 站也是采用 Go 开发的。
文章地址:36kr.com/p/172151899…
其他
除了上面介绍的这些,其实很多领域都能看到 Go 的影子。例如直播领域、游戏开发、AI 算法等等。在这其中 Go 为后台的调度系统、任务处理、批量的数据计算、系统监控等都提供了各种优秀的解决方案。
总结
Go 语言官方自称,之所以开发 Go 语言,是因为“近 10 年来开发程序之难让我们有点沮丧”。
Go 希望成为互联网时代的 C 语言。
Go 语言的出身可以说非常的豪华,主要开发者有肯.汤姆逊、罗布.派克和罗伯特.格里泽默。
有人形容 Go 语言为 Go = C + Python,说明 Go 语言既有 C 静态语言程序的运行速度,又能达到 Python 动态语言的快速开发。
Go 语言最主要的特性有自动垃圾回收、更丰富的内置类型、函数多返回值、并发编程等。
Go 语言的应用场景横跨目前互联网中非常热门的几个领域,比如分布式/云计算、微服务、大数据、区块链、大型游戏服务端开发和物联网等。
-EOF-