Go 1.1正式发布,性能显著改善、语言细微变化

最近,Go 1.1正式发布,相比1.0,Go 1.1包含了许多改进。最重要的改进是性能。优化的地方包括编译器、链接器、垃圾回收器、goroutine调度、map实现和部分标准库等等。开发者编写的代码在Go 1.1环境中性能会明显提高。

语言本身也有一些细微的变化,其中值得注意的两处是:

  • return语句的变化,会使程序结构更加整洁。
  • 方法值(mehod value)的引入会便于将方法作为函数值绑定到它的接收者。

在Go 1.1中,并发编程更加安全,引入了race detector查找内存的同步错误。具体的细节可以查看手册。

相关工具和标准库也得到了改进和扩展,详细内容可以查看发布说明。

去年三月份,Go 1.0正式发布,之后陆续发布了三个小版本,都是为了解决严重问题。根据兼容性指南,Go 1.1与1.0保持兼容,所以建议开发者都升级到最新版本。

Go在并发编程方面的显著优势让其在短时间内引起了社区和公司的重视和实践。例如,InfoQ之前曾经报道过Iron.io从Ruby迁移到Go的明显改进:

  • 服务器数量从30台减少到2台,而且第2台仅用于实现冗余。
  • CPU利用率下降至5%以下。
  • 所用内存也下降了很多。Rails应用在启动时需要接近50MB内存,而Go版本在启动时只需要几百KB内存。
  • 连锁故障成为历史。
  • 运行于成百上千台服务器上的新服务完全用Go编写。
  • 他们认为,Go的使用使他们得以“构建伟大的产品,得以成长和扩展,同时还能吸引一流人才”。他们的博客中写道:“我们认为,在可预见的未来,它将继续帮助我们成长。”一般建议根据人才库的规模来选择编程语言,他们发现Go语言的选择帮助他们吸引了顶级人才。
  • 容易部署,因为Go程序会编译为一个单一静态映像。
  • Go存在的小问题:需要学习一种新语言,库还有限。
  • 如果服务器流量很高,或者你想应对突发的增长,Go是很好的选择。

“Go Web编程”作者谢孟军在接受InfoQ专访时也谈到了Go在Web编程方面的优势

Go语言设计的时候是系统级别的语言,所以他本身就有性能上面的优势。其次Go在Web开发中内置的net/http包对于开发Web非常方便,用户可以很方便的就搭建一个Web应用。熟悉PHP的同学可能对于nginx+fastcgi配置都很熟悉,但是Go开发的应用就不需要nginx,因为它自己就可以监控网络,解析数据包,而不依赖任何东西,你编译完之后扔到服务器起来就好了,这省去了一些部署的部分。最后就是Go的并发支持,大家都听说过摩尔定律,硬件只会越来越快,CPU的核数也会越来越多,那么Go的这个特性就让我们这些程序员从以前的多线程处理中解放出来,让Go语言的runtime来帮我们做这个事情,那用使用Go来编写Web何乐而不为呢?

“Go语言编程”作者Mark Summerfield总结了Go语言的关键优点:

  • 像闪电一样快的编译。这使得编辑/编译/运行的周期和Python的编辑/运行周期一样快。
  • 非常高级的并发。你可以很轻松地使用Go语言编写并发程序,而不会有任何显式的锁。另外,goroutine通过操作系统线程多路传输的方式,这意味着,如果你的算法最好以成千上万个并发线程来表示,那么你就可以创建那么多goroutine——而对于线程,通常最好不要创建过多。
  • 无初始化和垃圾回收。这让我们避免了整整两类错误的发生,让编码更简单。
  • 语言本身非常小,让一般的程序员就可以掌握。当考虑模板语言的时候,C++98/03已经不是一般程序员所能接受的, 而C++11更大,也更复杂。与它们相比,Go语言:
  • 使用了新奇的方式来实现面向对象。我发现这种方法很有趣。
  • 对Unicode的支持。我非常喜欢Go语言让你可以使用原生UTF-8或者使用根据你想要的来使用Unicode字符的方式。

但是,开发社区对Go的看法并不总是积极的,Python和Go语言的实践者Yuval Greenfield在“Why I’m not leaving Python for Go”的博文中批评了Go语言的错误处理机制。他首先引用了Go语言的设计者对错误处理机制的看法:

在Go语言中,错误处理非常重要。语言的设计和规范鼓励开发人员显式地检查错误(与其他语言抛出异常然后catch住是不同的)。这种机制某种程度上使得Go语言的代码冗长重复,但是幸运的是你可以利用一些技巧来把冗长的代码最小化。

Yuval表示这点他无法忍受,每一次函数的调用都需要if语句来判断是否出现错误。Go语言并没有坚持要采用这种冗长的错误机制。它也允许忽略这些函数调用错误。但是这样做很危险。理论上,我们要求开发人员决不能忽略返回的错误。而实际上,只有在一些关键性的错误上面处理才是必要的。关于panic/recover机制,Yuval认为也不够出色,因为连Go的标准库都不怎么用这种机制:为什么索引溢出的数组要比错误格式的字符串或者失败的网络连接更需要panic呢?Go语言希望能够完全避免异常,但实际上不能,总有一些异常会在某处发生,让开发人员在错误出现时感到困惑。

Mark Summerfield认为Go语言的操作符重载存在问题:

IMO这个大程序包(针对big.Int和big.Rat类型)很难使用,因为你无法对操作符重载。另外,尽管Go缺少泛型,但那只是针对于类库编写者的问题。由于Go拥有其它语言特性,所以不太需要泛型,比方说它对“<”的操作符重载对于定义自定义的数据类型就非常好。

不管怎样,虽然在最新一期的TIOBE编程语言排行榜前二十名的榜单中看不到Go语言的身影,但是Go语言的崛起已经势不可挡,更多的开发者准备或者已经开始实践Go语言编程了,在上个月刚刚结束的QCon北京2013大会上,“新锐编程语言”专题中特意包含了Go语言相关的演讲。

你可能感兴趣的:(Go 1.1正式发布,性能显著改善、语言细微变化)