继 2012 年 3 月 Google 发布 Go 语言的第一个正式版本 Go 1 之后,时隔一年,Google 将于近期发布 Go 1.1。通过从 Google 网站内收集到的信息,我们了解到新版本保持了对旧版本的兼容性,同时还添加了一些重大的语言特性,修改了大量类库,并且改善了编译器、类库和运行时的实现。
Google 相信,很多用户仅仅通过安装新版本并重新编译已有程序就能看到显著的性能提升。以下就是 InfoQ 了解到的,即将发布的新版 Go 语言将为我们带来的新特性(具体信息以正式发布时的特性列表为准)。
语言方面的变化如下:
- 在 Go 1.1 中常量 0 作为除数时会引发编译错误而不是运行时错误。
- 对 Unicode 文本中的代理项做了处理,在 Go1.1 中代理项约束内置到了编译器、类库和运行时中。
- 实现了方法值,也就是能够绑定到指定接收值的函数。
- 引入了终止语句的概念,能够更加自由地使用“return”语句。
在实现和工具方面,新版本也做了诸多改进,包括:
- 命令行标记解析。
- 64 位平台上的 int 大小。
- Unicode 文本。
- gc 编译器。
- 修改了 go/go test/go fix 命令。
在性能方面,使用 Go 1.1 gc 工具套件编译的代码将为大多数应用带来 30% 到 40% 的性能提升,甚至会更高,当然对于少数程序性能提升并不明显或者没有提升。基于性能考虑,新版本对工具和类库做了很多微调,其中特别需要注意的几个主要变动如下:
- gc 编译器在大多数情况下会生成更好的代码,最重要的莫过于 32 位 Intel 架构上的浮点数。
- gc 编译器会做更多的内联,包括一些运行时操作,如 append 和接口转换。
- 重新实现了 Go Map,大大降低了内存占用和 CPU 时间消耗。
- 优化了垃圾回收器的并行化处理,降低了程序在多 CPU 上运行的延迟。
- 垃圾回收器更加精确,花费的 CPU 时间更少,并能显著降低堆大小,在 32 位架构上尤为明显。
- 运行时和网络类库紧耦合,网络操作仅需要少量的上下文切换。
新版本 Go 语言对标准类库也做了大量更新,包括:
- 增加了一个新类型 Scanner ,以行或者空格分隔单词的形式读取输入更加容易。
- 对传入 ResolveTCPAddr 的网络名做了限定,不再像 1.0 那样可以使用“tcp”、“tcp4”和“tcp6”之外的字符,在 1.1 中使用其他的字符串将会返回一个错误。其他的解析器 ResolveIPAddr 、 ResolveUDPAddr 和 ResolveUnixAddr 也是如此。同时 ListenUnixgram 将返回 UnixConn 而不是 UDPConn 。
- 在新版本中能够使用 reflect 包运行“select”语句。新方法 Value.Convert (或者 Type.ConvertibleTo )提供了执行 Go 转换或者对 Value 进行类型断言操作的功能。同时 reflect 包还新增了 MakeFunc 、 ChanOf 、 MapOf 和 SliceOf 等函数。
- 在 1.1 版本中 FreeBSD、Linux、NetBSD、OS X 和 OpenBSD 平台返回的时间精确度为纳秒。
- 过期的和旧的子树转移到了 go.exp 和 go.text 子库中
对于类库所做变更还有很多,在此无法一一列举了,感兴趣的读者可以查看 Google 提供的介绍。
感谢侯伯薇对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。
评论