Go 1.12
昨天,Go 官方釋出 1.12 版本。本文介紹下 Go 1.12 版本變更的內容。
Go 1.12 正式版釋出了,距離上個正式釋出版 Go 1.11 已經過去半年。跟往常一樣,Go 1.12 保持了 相容性承諾,預期所有 Go 程式會像之前一樣正常編譯。新版本的更新亮點有: TLS 1.3 的初步支援、模組支援的更強大以及提升 macOS & iOS 的前向相容性。新版在語言規範方面沒做改動。
工具
go tool vet
不再支援;- 二進位制包在下個版本將不再支援;
go tool tour
不再包含在主二進位制發行版中,需要手動安裝;- Go 1.12 在 trace 工具加入了Mutator Utilization 圖的支援,它可以方便發現 GC 效能受限的情況;
- Go Module 進一步支援。計劃在
Go 1.13
預設啟用 module 模式。
當 GO111MODULE
設定為 on
時,go 命令現在支援模組目錄之外的模組感知操作,前提是這些操作不需要解析相對於當前目錄的匯入路徑或顯式編輯 go.mod
檔案。諸如 go get
,go list
和 go mod download
之類的命令就像在具有初始空要求的模組中一樣。
go 命令下載和解壓縮模組現在可以安全地同時呼叫。模組快取記憶體(GOPATH/pkg/mod)必須駐留在支援檔案鎖定的檔案系統中。
go.mod
檔案中的 go 指令現在指示該模組中檔案使用的語言版本。如果沒有現有版本,它將被設定為當前版本(go 1.12)。如果模組的go指令指定的版本比正在使用的工具鏈更新,則 go 命令將嘗試構建軟體包,並且僅在該構建失敗時才會記錄不匹配。
當使用活動模組無法解析匯入時,go 命令現在將在查詢模組快取記憶體和常用網路源之前嘗試使用主模組的replace 指令中提到的模組。如果找到匹配的替換但但replace指令未指定版本,則 go 命令使用從零time.Time
(例如 v0.0.0-00010101000000-000000000000
)派生的偽版本。
Runtime
- 提升了大量堆(Heap)活躍狀態情況下的清理效能,這減少了垃圾回收之後的分配延遲,可以更好地將記憶體釋放回作業系統;
- Runtime 的 timer 和 deadline 程式碼隨著 CPU 數目的增加,會有更好的表現。這提升了網路連線最後期限(deadline)相關操作的效能;
- 對大型堆分配的相關修復,提升了記憶體配置檔案的精確性;
平臺相關
其中關於 FreeBSD 和 macOS,Go 1.12 是最後一個支援 FreeBSD 10.x 和 macOS 10.10 Yosemite 的版本。下個版本的 Go 1.13 將要求 FreeBSD 11.2+ 或 FreeBSD 12.0+,對於 macOS,則要求 macOS 10.11 El Capitan 或更新版本。
核心庫
- TLS 1.3
Go 1.12 在 RFC 8446 指定的crypto/tls
包中新增了對 TLS 1.3 的選擇支援。可以通過將值 tls13 = 1
新增到 GODEBUG
環境變數來啟用它。 它將在 Go 1.13
中預設啟用。
- 庫的微小變更。與往常一樣,承諾保持
Go 1
的相容性情況下,庫中有各種微小的更改和更新。
小結
Go 的包管理是一直為人詬病,從 Go 1.5 引入的 vendor 機制,到準官方工具dep
,go modules
隨著 Go 1.11 的釋出而和我們見面了,這是官方提倡的包管理,乃至專案管理機制,可以不再需要GOPATH的存在。到當前的 Go 1.12 ,Go 語言做了很多努力,正如 Go 官方部落格所說:
2018 was a great year for the Golang ecosystem, with package management as one of our major focuses.
2018 年是 Go 生態系統的重要一年,包裝管理是我們的主要關注點之一。 2018 年 2 月,在社群範圍內討論如何將軟體包管理直接整合到Go工具鏈中,並且在8月份,Go 1.11中提供了該功能的第一個粗略實現,稱為 go modules
。 遷移到 go modules
將是 Go 生態系統中影響最深遠的變化。轉換整個生態系統:程式碼、使用者、工具等。從 GOPATH 轉換到模組將需要在許多不同領域開展工作。 模組系統將幫助我們為Go生態系統提供更好的身份驗證和構建速度。
相比 godep 和 vendor 機制而言,go modules
已經很先進,Go 1.12 已經發布,可以考慮逐步遷移到go modules。
瞭解更詳細的釋出日誌,檢視原文。