继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提供的介绍。