本文是「vangoleo的Go语言学习笔记」系列文章之一。
官网: http://www.vangoleo.com/go/hello-golang/
我在2015年第一次接触Go语言完成了Hello World随后也一直在关注这门新语言。至今Go语言发展已经过去十年多了越来越受到广大开发者的关注而且随着云原生、IoT、区块链的流行Go似乎要成为21世纪的第一语言。Docker、Kubernetes、以太坊等重量级的项目都是基于Go开发。
Go语言是Google公司在2009年开源的一门高级编程语言它为解决大型系统开发过程中的实际问题而设计支持并发、规范统一、简单优雅性能强大被很多Go语言传道者誉为“云计算时代的C语言”。
近期我在系统地学习Go语言并整理了一些学习笔记。后续会和大家进行分享。今天先和大家聊聊Go语言的发展史和Go语言的特点。
Go的命名
这是一封由Rob Pike在2007年9月25日下午3:12发送给Robert Griesemer和Ken Thompson的有关编程语言讨论主题的邮件邮件正文大意为
我在开车回家的路上得到了些灵感:
- 给这门编程语言取名为“go”它很简短易书写。
- 工具类可以命名为goc、 gol、goa。
- 交互式的调试工具也可以直接命名为“go”。
- 语言文件后缀名为 .go 等等。
和很多伟大的公司诞生于车库一样Go语言的命名也和汽车有关。以上就是Go语言名字的来源。我个人是很喜欢Go这个命名的看似很随意的一个想法却很精准。有着Google的纯正血统又体现了语言简单优雅的特点。而且Go里面开启一个协程的关键字就是go。
谷歌工程师的20%时间
自此之后Robert、Rob和Ken三个人开始在Google内部进行了研发一直到了2009年Go正式开源了Go项目团队将2009年11月10 日即该语言正式对外开源的日字作为其官方生日。源代码最初托管在http://code.google.com
上之后几年才逐步的迁移到 GitHub上。
谷歌的“20%时间”工作方式允许工程师拿出20%的时间来研究自己喜欢的项目。语音服务Google Now、谷歌新闻Google News、谷歌地图Google Map上的交通信息等全都是20%时间的产物。
Go语言最开始也是20%时间的产物。
Go语言的三位创始人
邮件中提到的就是Go语言最重要的3位创始人
让我们来认识一下这3位大佬
- Rob Pike曾是贝尔实验室Unix开发团队成员Plan9操作系统开发的主要领导人Inferno操作系统开发的主要领导人。
- ken tomption图灵奖得主C语言前身B语言的作者Unix的发明人之一操作系统Plan 9的主要作者。 共同开发了UTF-8。
- Robert曾为谷歌的V8 JavaScript引擎和Chubby开发代码。
Go语言血统
编程语言的发展和物种进化类似。每种编程语言都会从先前的语言吸取精华再进行创新和改进。下图展示了Go从它的前辈们继承了哪些优点Go正是站在这些巨人的肩膀上在云时代发挥越来越大的作用。
Go语言从前辈们继承的特点
- C语言Go语言有时候被描述为“C类似语言”或者是“21世纪的C语言”。Go从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想还有C语言一直所看中的编译后机器码的运行效率以及和现有操作系统的无缝适配。
- Pascal但是在Go语言的家族树中还有其它的祖先。其中一个有影响力的分支来自Niklaus Wirth所设计的 Pascal)语言。然后Modula-2语言激发了包的概念。然后Oberon)语言摒弃了模块接口文件和模块实现文件之间的区别。第二代的Oberon-2)语言直接影响了包的导入和声明的语法还有Oberon)语言的面向对象特性所提供的方法的声明语法等。
- CSPGo语言的另一支祖先带来了Go语言区别其他语言的重要特性灵感来自于贝尔实验室的Tony Hoare于1978年发表的鲜为外界所知的关于并发研究的基础文献顺序通信进程(communicating sequential processes 缩写为CSP)。在CSP中程序是一组中间没有共享状态的平行运行的处理过程它们之间使用管道进行通信和控制同步。不过Tony Hoare的CSP只是一个用于描述并发性基本概念的描述语言并不是一个可以编写可执行程序的通用编程语言。Go语言使用管道在协程进进行通信。
重量级应用
如下是列举的一些Go语言的重量级应用
Go的优点
如果现实世界需要我能够在几天内对一个生产系统进行原型设计、测试和部署而且在每秒能处理比原来多5倍请求CPU和内存的开销还都很小。我想大概只有Go语言可以胜任了。
Go语言有如下优点:
- 单独的二进制发布Go项目编译会生成一个静态的可执行文件。该文件可独立运行而不需要其他依赖。这种方式特别适合于云原生容器环境。
- 交叉编译在任何操作系统上都可以编译在其他平台上可运行的二进制文件。比如在Mac系统上可编译出在Linux和Windows上可运行的二进制文件。
- 垃圾回收Go语言支持垃圾回收。相比较C++Rust等需要开发者自己控制。
- 执行性能Go非常的快。性能接近于C++。远高于JavaPython、Node。
- 开发效率Go语言同时具备静态语言的运行性能和动态语言的开发效率。
- 简单高效Go语言的设计哲学里就包括了简单和高效。一个典型的反例就是复杂臃肿的Java语言。
- 并发性语言层面支持并发通过协程和通道简化并发开发提高并发性能。
- 丰富的标准库Go标准库覆盖了文本IO网络加密Web服务远程RPC模板引擎等功能。
- 可以调用C语言可以调用C语言函数进一步优化性能复用C语言庞大的生态系统。
- 快速编译时间Go的编译特别快。大家可以参考两款静态博客生成系统Hexo(Node开发)和Hugo(Go开发)。
- 工程型Go语言设计的目的就是成为一门工程语言解决实际的工程问题。Go语言定义了开发规范并提供了丰富的工具。使用Go语言可以编写出容易阅读和理解容易测试、维护和扩展的程序。
Go缺点
- 缺少重量级框架。如Ruby的RailsPython的DjangoJava的Spring。
- 错误处理没有异常系统。Go官方正在解决该问题。
- 软件包管理很长时间以来Go官方都没有一套软件包管理体制。直到最近Go的1.13版本正式引入了Go Module作为官方的依赖管理工具。
- 不是标准的面向对象的编程模型这个也是Go语言的一个创新。如果你是坚实的OOP的拥护者可能会有些不适应。
文化
人们说每当你学习一门新的口语时你也会沉浸在说这种语言的人的某些文化中。因此您学习的语言越多您可能会有更多的变化。
编程语言也是如此。无论您将来如何应用新的编程语言它总能给你带来新的编程视角或某些特别的技术。
无论是函数式编程模式匹配还是原型继承一旦你学会了它们你就可以随身携带这些编程思想这扩展了你作为软件开发人员所拥有的问题解决工具集。它们也改变了你阅读高质量代码的方式。
而Go在这方面有一项了不起的财富。Go文化的主要支柱是保持简单脚踏实地的代码而不会产生许多冗余的抽象概念并将可维护性放在首位。大部分时间花费在代码的编写工作上而不是在修补工具和环境或者选择不同的实现方式上这也是Go文化的一部分。
Go文化也可以总结为“应当只用一种方法去做一件事并保持简单高效”。
一点注意事项。当你需要构建相对复杂的抽象代码时Go通常会妨碍你。好吧我会说这是简单的权衡。
本文由 www.vangoleo.com 发布