为什么我用 Go 来编程

jopen 10年前

Go 语言作为一种新颖的编程语言, 它最初是由谷歌为了服务器开发而发明出来的。 而它的发明者们,更是数位成就卓绝、技艺非常的计算机科学泰斗:像是 Ken Thompson 和 Rob Pike 这对老朋友。 我最近刚发表的一个重要的产品就使用了Go开发,从开发者产出效率和产品表现来说,Go语言很好地证明自己在这些方面的优越特性。也正因为如此,我所知的其它许多开发团队也在准备Go to "Go" (噢,这语言的名字是有多灵动啊!)。

仔细想想看,你要多久才能遇到一项编程创新同时兼顾了开发效率以及 计算性能?

在讨论GO语言之前,我想谈谈为什么我会喜欢上Ta. 我是在2001年开始开发小型网页应用,并开始接触各种各样的语言。 那时我是C++的绝对忠实粉丝。 到了在2004年,我开始接触PHP(非面向对象)。但没多久,我就讨厌PHP了。尤其是在没有运行程序前,我根本不能捕捉任何的错误。就在那时,我认识到以下两个编程概念非常重要:

1. “面向对象”只是一种编程方式,而并非唯一的方式。 而且有时候,它未必是最好的选择。

2. 标量(整形,字符,字符串,浮点型,布尔类型),序列(列表、数组)和映射(名值对)这些语言内置类型,其实已经基本满足大部分的数据结构需求。

PHP 用于小型应用的创作场景是绝对没得说。但是它难于测试,难于调试(太多的隐式类型转换)还有就是太慢。当我想暂时脱离PHP的时候,我在2007年和 Java偶遇了。 Java也许是我遇到过的最令人郁闷的语言。Java太严格,太无意义(换句话说太冗余)还有太“庞大”,包括各种的IDE,框架,编译环境配置等等。 需要完成繁琐的配置,我们才能开始开发。同时,我并不接受JVM(Java 虚拟机)的思想。它虚幻的便携性会带来沉痛的代价。

2008年,我开始接触 Python。5年前我曾经用Ta小试牛刀,但现在我是全身心的投入其中。我喜欢Python。 它支持多范型,语言很有语义,有很多亮点的东东,例如列表解析,生成器表达式,装饰器,关键字参数(**kwargs)等等。 它语义清晰,设计 紧密。它的强大力量,在写代码-运行-修正-运行的过程中表现的淋漓尽致... 开发周期中经常无需迭代。用Python写的代码经常比其他语言写的,更能按着我的意图去运作。

可是,Python有个突出的问题,就是它速度不快。我使用过Psyco这样的优化器,但是效果还不够理想。然后又尝试了Unladen Swallow优化器,可也不够理想。

在我开始用Python的时候,我发现Google对Ta情有独钟。 Python之父 -- Guido van Rossum 就是就职于Google. 过了一段时间,我听到了一个来自Google的新语言诞生了 -- Go.如果Go背后不是借助与名声赫赫的Rob和Ken,和诞生于世界上最伟大的IT公司,这个项目也许就在实验阶段就被解散了。

2009年Go语言发布的时候,我并未觉察到为什么它如此伟大,除了知道Go包含很多现代语言的结构和运行速度很快。


现在让我们先暂停一下思路,换一个话题。

在2010年末,当时我刚刚在Zynga工作,重新由Python转去使用php而使我有点时间。所以我花了一点时间去读了一些东西。其中在我读过的书中有一本书,在该书中一些讨论中,介绍了这样的一种概念:“数据流编程”(dataflow programming)和“声明式并发”(declarative concurrency).你可能需要通过前面的链接,去简单了解一下这个概念,因为这就是Go语言的核心特征。


在我学习数据流编程时,我想起 在yahoo的时候,当要并行地从多个数据源获取数据时,它是一个多么庞大的协定,有一些解决策略比如:最快源获胜(fastest-source-wins)、N/M响应 (wait-until-N-of-M responses),它们都有自己的超时处理等等。标准的方案是用一个带XML文档的Java守护进程去描述你想要的数据流。这种方法不是太优雅。我希望有一种语言本身就具有这种能力,并且不要像Oz语言那样学院派。那时我没有认识到Go语言就是我想要的。

去年年初一段时间,我们讨论并尝试寻找其他比PHP更为具体、性能更出色的编程语言--编译型语言。 去年年中,当我再一次去了解Go,发现它已经拥有Google大量的支持并且以已经发布了1.0版本的GA版本时,我们在构思一个新的需要处理并发的项目。PHP的无共享架构并不能很好地支持项目所需。我想,现在是个好时机去使用Go语言来突破。

基于Go的实践

在使用Go开发一些项目原型后,我有了更确切的实践感受:

  1. 来自编译器的强大功能: 使用编译型语言编程是一件愉快的事情。编译器不仅仅检查可能导致运行时异常的代码,而且最大程度上不允许这些代码的存在。当然,这不是Go语言的特性,但是Go语言编译器也提供这种功能。
  2. 标准的代码格式化功能:在团队开发中,代码实施统一格式化标准是非常必要的,所以代码格式化工具是很受欢迎的一项功能,它能降低“不是我的代码”的心理障碍。
  3. 精简语言特性:Go是一种非常紧凑的语言,语言特性也非常精简,在语言层面,它只保留了必要、成熟、确定的语言特性,在这点上它更类似于C语言,所以它易于学习和适合写程序。
  4. 内置强劲特性: 不管你是写web服务器程序、原始套接字服务器程序还是其它需要调用OS内置函数的程序Go标准库有大量相应的包。
  5. 简洁的并发库: Go的channel 和 goroutine能很好地处理并发,使用这2个特性,你不用像Node.js、Twisted那样编写整个程序的事件处理函数,就可以处理并发了。
  6. 入门简单:和其它需要配置复杂框架和IDE的语言相比,Go语言的入门时间会少很多。
  7. 快速开发:Go的生产率很高,它内置了大量服务器编程需要使用的组件,因此你能在很短时间内写好你的服务器端代码。更少的代码意味着更快速的排错。
  8. 适用于多核高性能环境 Go的rumtime在运行时出奇地速和稳定,对于这点,那些用Python写服务器代码的程序员将更有感受。不像Python和Node.js这些语言,Go的runtime能产生多个OS线程,且并行地运行它们。

在产品中使用 Go

某些 Go 语言的特性你只有在产品中才能体会,我真正喜欢 Go 语言的几个方面如下:

  1. 单个二进制文件: Go 生成静态链接的二进制文件,可在任意构建目标平台上运行。这对基于云的发布环境来说特别的棒,因为你只需要一个简单的 OS 映像就够了。相比之下,其他需要精心制作的依赖设置则差很多。
  2. 跨平台编译: 早些时候我提到关于 JVM 因为可移植性方面所做的权衡。实际上只是很少的 Java 程序需要移植到不同的系统。因为需要与目标系统的依赖管理耦合,使得 Java 变得有点流氓。而 Go 语言可以在任何机器上开发,只需要到目标平台上编译即可。我所需要做的就是复制交叉编译的二进制文件来实现可移植性。
  3. 内建剖析: 只需少数几行代码,你就可以实现一个 HTTP 服务来提供实时的 CPU、内存、go 程序、OS 线程、锁争用等信息。你可以可以使用 go 语言的工具链来访问 URL 并在应用内提供剖析的数据。真了不起!
  4. 可共享的代码: 代码共享最大的障碍就是项目的大小,或者是是代码量。即使人们可以访问一些代码库,它并不容易深入理解代码。因为它使用少数几行代码去实现 C/C++ 或者 Java 中同样的功能,使得代码更具备可读性,更易于分享。有限的语言规范也意味着它是不太可能会让有些人陷入晦涩的构造或“高级功能”。

总结

总之,我发现Go是迄今为止最好用的sever端编程语言,它具有Python语言优雅性和C/C++高性能的优点,退一步来说,即使它只具有Python 90%的易用性和C/C++ 90%的高性能,那也是不错的,而且它的优点不止这些:1)基于Go语言的程序比其他语言更容易在异构平台和虚拟环境下进行开发和部署;2)Go语言有利于分享和协作开发,因为它有单一的标准、精简的语言特性。


注:

翻译转自http://www.oschina.net/translate/why-program-in-go

原文转自http://tech.t9i.in/2013/01/why-program-in-go/