在最近發(fā)布的Go 1.9中,最重大的變化就是支持通過(guò)聲明類型別名(type alias)實(shí)現(xiàn)漸進(jìn)式代碼修復(fù)(gradual code repair)。Go 1.9同時(shí)還提升了垃圾收集器和編譯器。
根據(jù)Google的工程師Russ Cox所述,漸進(jìn)式代碼修復(fù)是代碼重構(gòu)中一種很有用的方式,對(duì)于大型的代碼庫(kù)來(lái)說(shuō)很有價(jià)值。簡(jiǎn)而言之,漸進(jìn)式代碼修復(fù)的目標(biāo)是通過(guò)一系列的步驟完成一個(gè)較大規(guī)模的重構(gòu),也就是說(shuō)不會(huì)在一次自動(dòng)化的提交中完成所有的變更,而是分成多次提交。原子性的重構(gòu)方式在概念上通常很簡(jiǎn)單,但是如果代碼庫(kù)很大的話,就會(huì)造成規(guī)模很大的代碼提交,這樣很難審查和合并。借助漸進(jìn)式代碼修復(fù),我們可以按照三個(gè)步驟來(lái)重構(gòu)代碼:首先,引入新的API,它應(yīng)該能與舊的API共存,所以我們不必立即修改所有使用舊API的代碼;然后,我們將使用舊API的所有地方替換為新API;最后,將舊的API移除。
為了啟用漸進(jìn)式代碼修復(fù),必須能為常量、函數(shù)、變量和類型創(chuàng)建另外一個(gè)備選的名稱?,F(xiàn)在,Go允許通過(guò)如下的方式聲明類型別名:
type OldAPI = NewPackage.API這樣的話,所有引用OldAPI的地方都會(huì)使用重構(gòu)之后的類型。如果讀者對(duì)漸進(jìn)式代碼修復(fù)的更多討論感興趣的話,那么Russ Cox的闡述是不容錯(cuò)過(guò)的。
按照Google的工程師Francesc Campoy所述,針對(duì)Go 1.9所付出的大多數(shù)工程方面的努力都投入在提升運(yùn)行時(shí)、核心庫(kù)以及工具方面。最重要的變更包括:
Go的垃圾收集提供了更好的性能,這要?dú)w功于一些庫(kù)函數(shù)會(huì)觸發(fā)并發(fā)垃圾收集機(jī)制,這樣的話只會(huì)阻塞調(diào)用協(xié)程(goroutine),而不會(huì)阻塞整個(gè)程序。另外,大對(duì)象的堆內(nèi)存分配也得到了明顯提升。
Go 1.9編譯器能夠并行編譯同一個(gè)包中的函數(shù)。在之前版本的編譯器中,已經(jīng)支持了并行編譯不同包中的函數(shù)。
在核心庫(kù)方面,Go 1.9借助單調(diào)時(shí)間跟蹤(monotonic time tracking),讓time包的使用變得更加安全。這樣的話,即便是存在掛鐘時(shí)間調(diào)整(wall clock adjustment),Time的對(duì)比也會(huì)更加容易。另外,在sync包中,新的Map類型提供了一個(gè)線程安全的并發(fā)map,具有恒定分?jǐn)倳r(shí)間(amortized-constant-time)的加載、存儲(chǔ)和刪除功能。
要了解Go 1.9的所有變更的話,可以參考發(fā)布文檔。
查看英文原文:Go 1.9 Introduces Type Aliases, Improves Runtime and Tooling