這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Go1.9於2017年8月24日正式發布,新版本的Go有一些新變化:標準庫,運行時,以及新的工具。在這個版本中,Go團隊主要的工作都是在運行時的改進以及一些工具鏈的開發中。雖然這些變化雖然不夠令人激動,但是這的確是一個很棒的更新。
Type alias
類型別名是這個版本中最重要的變化,有了類型別名之後,能夠讓開發人員更加便利地實現漸進升級。一個典型的類型別名可以通過如下方式聲明:
type T1 = T2
如此一來,T1
就是T2
的一個別名了,實際上,byte
類型就是uint8
的一個別名。type alias 文檔和重構樣本文章將會有更多的細節。
math/bits
包
新的math/bits包提供了對不帶正負號的整數進行位計數和處理的函數,這些函數針對不同的CPU架構體系進行了最佳化。例如,針對x86/64
體系,bits.TrailingZeros(x)
採用的是BSF指令。
Concurrent map
在sync
包中增加了新的Map類型,該Map能夠保證並發訪問的安全,如果想要擷取關於並發安全的Map的更多細節可以閱讀GopherCon 2017 lightning talkingslides。這個Map並不是為了取代標準的Go map,請閱讀相關文檔以取得並發安全map的正確使用方法。
testing Helper
在testing
中也加入了一個新特性,那就是Helper
方法,tesing.T
和testing.B
中均添加了該方法。該方法能夠標記某個測試方法是一個helper
函數,當一個測試包在輸出測試的檔案和行號資訊時,將會輸出調用help
函數的調用者的資訊,而不是輸出helper
函數的內部資訊。舉例來說:
package pimport "testing"func failure(t *testing.T) { t.Helper() // This call silences this function in error reports. t.Fatal("failure")}func Test(t *testing.T) { failure(t)}
因為failure
函數標記自己為helper
函數,如果測試失敗,即t.Fatal
函數被調用時,錯誤資訊將會輸出在第11行,而不是在第7行。
monotonic time
time
現在在計時時將採用monotonic time
(流逝時間),現在在計算兩個時間差的時候將會更加安全,就算wall time
(牆上時間)被調整了。例如如下的代碼將會準確地計算流逝時間,即使當前的系統時間被修改了:
start := time.Now()f()elapsed := time.Since(start)
更多細節請參閱package docs和design document。
更快的編譯速度
現在Go的編譯器將會更快,Go 1.9在包之間將並行編譯。
更多細節
Go 1.9的更多改進和新特性參閱:Go 1.9 release notes