为什么选择GO语言?

Go是2009年11月10日推出的一个新的系统编程语言并保持快速的更新。Go是一个优秀的工具,优雅的并发模型和独特的面向对象的方法,深深的吸引了来自编译和脚本语言开发者的关注。

“Go在未来将成为服务器的语言。” –  Tobias Lütke, via Twitter

是否真的像Tobi断言的一样么?我们可以评估之前,如果Go是现代网络发展的灵丹妙药,让我们来看一下现在网络开发的发展趋势,并考虑一下什么是“未来服务器语言“应该提供的。

Real-Time Web (实时WEB服务)

Ajax开始于2005年。

现代网络应用程序提供了实时协作,TrelloAsana 是两个典型的例子。

有些应用程序采用bolt-on解决方案,像推销员一样。他们的工作一直都是在紧要关头,感觉类似于用3D技术拍摄的3D影片与影片后期追加3D效果的对比。

“人们期望他们使用的任何产品都有好的体验。” – Gene Smith

Go语言需要解决C10K的问题,能够通过单一的实例保持与成千上万的用户连接,而不耗尽可用内存。

Cloud Computing (云计算)

云计算和数据中心是有区别的。云计算可以提供随机应变的服务,可以调节流量,也可以根据你的实际需求自动调节。

当扩展或重启实例时,某些虚拟机需要很长,很长,很长的时间变的可用。脚本语言通常需要加载和分析每行代码。

Go程序启动非常快,所以我们的服务器可以处理不断增长的需求。空闲实力,预热请求,或者其他工作都是不需要的。

Multicore Performance (多核性能)

自2004年首款x86双核处理器推出以来,多核处理器现在已经成为了主流。即使数据中心使用的是商业硬件,我们应该也会看到处理器的核数定期成倍的增长。

Go语言有好的扩展,我们不需要改写软件去利用CPU更多的核。

Service Oriented Architecture (面向服务的架构)

无论您的应用程序设计是否遵循SOA的方式,他必然会涉及多项服务:数据库,缓存,搜索和消息队列。

SOA允许我们建立或重构部分的堆栈使用不同的工具和语言。这里有一个Java库你真的需要么?让他成为一个内部服务吧。

Go使用异步I/O,以至于我们的应用程序可以与任意数量的服务器交互,而不会阻塞WEB请求。

The Fat Client Renaissance (胖客户端的文艺复兴)

手机终端,HTML5和WEB组建,客户端可以做很多的事情而服务器端越来越瘦。现代应用的设计是基于“API first”,构建灵活性的接口真多不同的客户端。

Go不应该被昔日的框架束缚,他更擅长写APIs,且具有良好的JSON支持。

Report Card (报告卡)

那么Go语言的表现如何呢?此篇文章就是关于Go语言优劣分析的,很好!让我来比较一下之前我们喜爱的脚本语言。

 Async (异步)

Ruby和Python等语言多年困扰的同步APIs问题,这些APIs是不支持基于协同事件触发编程的。

“接下来,将经典/传统的同步API和新的异步API…将它们合并到一起,最终,将耗时数年。” Guido van Rossum,PYCON2013主题

至少Python是在正确的路上。

Node.js的分数会好一些,尤其是当选用了async.js这样的库。

Go运行的时候,可以确保任何一个Go的实例不会被其他实例阻塞。代码抒写是同步风格的而且完全无阻塞。不需要回调,所以这里没有“回调地狱(callback hell)” 这是一个伟大的SOA!

Goroutines

如果我们支持数千个链接而且并利用到多核,会发生什么?简单。使用线程和协程(Ruby调用fibers, Python使用generators)。Node.js有多核的集群模块。

Go有一个简单的模型。Goroutines 是基于系统线程的复用,堆栈根据需要增加。Go不仅解决了C10K问题,超越他吧!(C1000K)

而且不要忘了,Python和Ruby(MRI)仍然有GIL/ GVL。Go没有解释器,也不是一个虚拟机,所以没有全局锁。多核FTW!

Concurrency (并发)

Ruby并发的支持是留给用户的:

“我不认为自己能很好的处理并发,我想我无法在actor库上做出正确的决定。我更希望和你们讨论未来的标准并发模型“。- Yukihrio ‘Matz’ Matsumoto, Ruby Conf 2012 Q&A

为了实现这一目的,有了Tony Arcieri 的Celluloid框架 . 但是并发的稳定支持还是需要程序语言本身和运行时的支持。

Go提供的并发原型可以和actors模型媲美。

Static Binaries (静态二进制)

基于JVM的语言需要较慢的启动时间。这不仅仅影响服务的自动扩展性和服务的重启。这也影响到了他的发展。

Go语言的程序编译快速并能立即启动。

The Best of Both Worlds (两全其美)

如此Go已经为未来做好了准备,但是他是有趣的么?在我看来,是的!

Go提供了类型推断,哈希映射(字典),变长数组,用户自定义类型函数,隐晦接口,以上所有看起来都像类C语言的语法和语义一样。

“Go在灵魂比其他语言更接近C语言” – Mark Summerfield, Programming in Go.

他编译快速不需要Makefile文件,集成git等。包分发管理,通过gofmt重新格式化代码。编译某些类的时候是不需要测试的,代码自动补全的功能也很好通过 GoSublime 或者gocode

性能至关重要的代码可以被优化,而不需要使用C语言实现,这样的乐趣不会结束。我们有地鼠!有什么能比这更有趣的吗?

Go确实是最好的提供了动态和静态编译的语言。这很有趣也很高效。

如果你喜欢Go,那就去深入了解并得第一手的经验。所以尝试去做一个小项目,自己试试看吧!

Reboot  (重新开始)

这是非常难以改变的,一种编程语言一旦被广泛采用。即使语法/语义可以显著改善,但太多的代码需要更新。

当我看现在的ruby,看到C++11在不断的更新。二十多年的繁琐,而且还增加一些没有多少人会需要的特性。

一种新的语言,是一个全新的开始。

Go设计的很清晰,它可以简洁的表述出明确的意思。Go语言里,是不会出现歧义的,即使这意味着增加冗长。

“Go被多位工程师描述成为所见即所得的语言。也就是说,代码所表述的和页面上看到的是一样的” – Peter Bourgon, Go at SoundCloud

Go规范并容易理解,不会给人遥不可及的感觉。简单,垂直交互的概念是很重要的。

TL;DR (TL博士)

这次谈话触及到了“为什么选择Go语言”,还提及到了一个简单的介绍,Go语言背后的人和为什么Go被设计成这个样子。

更多的Go讨论,  Vimeo channelYouTube playlist. 也可以在Go的主页上看 InfoQ 和 Robert Griesemer 的采访在 Channel 9. 最后, 在 Go Wiki 上也提供了一系列的访谈.

FAQ

我应该去学习Go语言么?我没有看到更多的就业机会(在我的城市)。 学习他总是好的至少扩展了你的想法。即使学习Go并不会得到一份工作,你将会有一个新的视角, 在使用其他语言的时候。例如,学习Go的接口可以提升你对Python和Rbuy里的鸭类型 (duck types)的看法。 个人而言,我是2005年圣诞节开始学习Ruby on Rails的,之前我可以找到任何工作都会用到 它。现在我作为Rubyist已经服务了很多年。 我可以构建我的SaaS服务在Go之上么? 本文的目标读者是程序员。好的开发人员考虑到长远的问题。公司有不用的目标:你可以尝试去做 ,并证明你的想法。 Go的生态系统还比较年轻。你可以找到一个更快的方式实现MVP,像使用Ruby on Rails框架。 当然这仍然需要视情况而定。 Go有没有像Rails 或者 Django 一样的WEB框架呢? 在写这篇文章的时候,Go还没有一个像Rails一样的全栈(full stack)风格的WEB框架。 Revel现在是比较接近“全栈”风格的一个框架。 我推荐 Gorilla Web Toolkit。他提供了很多的支持,你可以在Sinatra或Flask上找到。 这是一个好的教程(tutorial)让我们从标准库和采用Gorilla开始。 如果你用MongoDB做持久化,mgo是你需要的包。 当你第一次看到Go的语法,你喜欢他么? *Ruby爱好者一般都喜欢语法问题,无论是snake_case,单行IF语法,或者是块定义。 然这些感觉很中性,这是我让我喜欢上Go语法的一些事情: 1. 隐私声明是一个简洁的方式导出特定的字段,这样很容易区分公开的API和内部使用的API 2. 我更喜欢用驼峰的命名方式在整个WEB应用程序里,而不是和JavaScript库交互时使用驼峰 ,而其他地方使用 sank_case 的方式。 3. 初始化(嵌套)arrays/slices,maps和structs用同样的复合文本语法真的很方便。 4. 我喜欢gofmt和我的文件保存快捷键绑定,自动格式化代码为我节省了大量时间。 *

*此文翻译于  http://nathany.com/why-go