繼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提供的介紹。
