繼2012年3月Google發(fā)布Go語(yǔ)言的第一個(gè)正式版本Go 1之后,時(shí)隔一年,Google將于近期發(fā)布Go 1.1。通過(guò)從Google網(wǎng)站內(nèi)收集到的信息,我們了解到新版本保持了對(duì)舊版本的兼容性,同時(shí)還添加了一些重大的語(yǔ)言特性,修改了大量類庫(kù),并且改善了編譯器、類庫(kù)和運(yùn)行時(shí)的實(shí)現(xiàn)。
Google相信,很多用戶僅僅通過(guò)安裝新版本并重新編譯已有程序就能看到顯著的性能提升。以下就是InfoQ了解到的,即將發(fā)布的新版Go語(yǔ)言將為我們帶來(lái)的新特性(具體信息以正式發(fā)布時(shí)的特性列表為準(zhǔn))。
語(yǔ)言方面的變化如下:
- 在Go 1.1中常量0作為除數(shù)時(shí)會(huì)引發(fā)編譯錯(cuò)誤而不是運(yùn)行時(shí)錯(cuò)誤。
- 對(duì)Unicode文本中的代理項(xiàng)做了處理,在Go1.1中代理項(xiàng)約束內(nèi)置到了編譯器、類庫(kù)和運(yùn)行時(shí)中。
- 實(shí)現(xiàn)了方法值,也就是能夠綁定到指定接收值的函數(shù)。
- 引入了終止語(yǔ)句的概念,能夠更加自由地使用“return”語(yǔ)句。
在實(shí)現(xiàn)和工具方面,新版本也做了諸多改進(jìn),包括:
- 命令行標(biāo)記解析。
- 64位平臺(tái)上的int大小。
- Unicode文本。
- GC編譯器。
- 修改了go/go test/go fix命令。
在性能方面,使用Go 1.1 GC工具套件編譯的代碼將為大多數(shù)應(yīng)用帶來(lái)30%到40%的性能提升,甚至?xí)撸?dāng)然對(duì)于少數(shù)程序性能提升并不明顯或者沒(méi)有提升。基于性能考慮,新版本對(duì)工具和類庫(kù)做了很多微調(diào),其中特別需要注意的幾個(gè)主要變動(dòng)如下:
- GC編譯器在大多數(shù)情況下會(huì)生成更好的代碼,最重要的莫過(guò)于32位Intel架構(gòu)上的浮點(diǎn)數(shù)。
- GC編譯器會(huì)做更多的內(nèi)聯(lián),包括一些運(yùn)行時(shí)操作,如append和接口轉(zhuǎn)換。
- 重新實(shí)現(xiàn)了Go Map,大大降低了內(nèi)存占用和CPU時(shí)間消耗。
- 優(yōu)化了垃圾回收器的并行化處理,降低了程序在多CPU上運(yùn)行的延遲。
- 垃圾回收器更加精確,花費(fèi)的CPU時(shí)間更少,并能顯著降低堆大小,在32位架構(gòu)上尤為明顯。
- 運(yùn)行時(shí)和網(wǎng)絡(luò)類庫(kù)緊耦合,網(wǎng)絡(luò)操作僅需要少量的上下文切換。
新版本Go語(yǔ)言對(duì)標(biāo)準(zhǔn)類庫(kù)也做了大量更新,包括:
- 增加了一個(gè)新類型Scanner,以行或者空格分隔單詞的形式讀取輸入更加容易。
- 對(duì)傳入ResolveTCPAddr的網(wǎng)絡(luò)名做了限定,不再像1.0那樣可以使用“tcp”、“tcp4”和“tcp6”之外的字符,在1.1中使用其他的字符串將會(huì)返回一個(gè)錯(cuò)誤。其他的解析器ResolveIPAddr、ResolveUDPAddr和ResolveUnixAddr也是如此。同時(shí)ListenUnixgram將返回UnixConn而不是UDPConn。
- 在新版本中能夠使用reflect包運(yùn)行“select”語(yǔ)句。新方法Value.Convert(或者Type.ConvertibleTo)提供了執(zhí)行Go轉(zhuǎn)換或者對(duì)Value進(jìn)行類型斷言操作的功能。同時(shí)reflect包還新增了MakeFunc、ChanOf、MapOf和SliceOf等函數(shù)。
- 在1.1版本中FreeBSD、Linux、NetBSD、OS X和OpenBSD平臺(tái)返回的時(shí)間精確度為納秒。
- 過(guò)期的和舊的子樹(shù)轉(zhuǎn)移到了go.exp和go.text子庫(kù)中
對(duì)于類庫(kù)所做變更還有很多,在此無(wú)法一一列舉了,感興趣的讀者可以查看Google提供的介紹。