Go 部落格

Go 1.6 釋出

Andrew Gerrand
2016年2月17日

今天我們釋出了 Go 1.6 版本,這是 Go 的第七個主要穩定版本。您可以立即從 下載頁面 獲取。雖然六個月前 Go 1.5 的釋出 包含重大的實現變更,但此次釋出更加側重於漸進式改進。

最顯著的變化是 net/http 包 支援 HTTP/2。HTTP/2 是一種新的協議,是 HTTP 的後續版本,已經得到了瀏覽器廠商和主要網站的廣泛採用。在 Go 1.6 中,在使用 HTTPS 時,伺服器和客戶端都 預設啟用 了對 HTTP/2 的支援,為各種 Go 專案帶來了新協議的 優勢,例如流行的 Caddy Web 伺服器

模板包增加了一些新功能,支援 修剪模板操作周圍的空格 以生成更簡潔的模板輸出,並引入了 {{block}} 操作,可用於建立基於其他模板構建的模板。一個 新的模板示例程式 演示了這些新功能。

Go 1.5 引入了對“vendor”目錄的 實驗性支援,該功能透過環境變數啟用。在 Go 1.6 中,該功能現在 預設啟用。如果源樹包含一個名為“vendor”的目錄,但未使用新功能的方式,則需要進行更改以避免構建失敗(最簡單的修復方法是重新命名該目錄)。

執行時增加了對併發誤用 map 的輕量級、盡力而為的檢測。一如既往,如果一個 goroutine 正在寫入 map,那麼任何其他 goroutine 都不應該併發地讀取或寫入該 map。如果執行時檢測到這種情況,它將列印診斷資訊並崩潰程式。瞭解此問題的最佳方法是使用 競態檢測器 執行它,它將更可靠地識別競態並提供更多細節。

執行時還改變了列印程式終止 panic 的方式。它現在只打印 panic goroutine 的堆疊,而不是所有現有 goroutine 的堆疊。此行為可以透過 GOTRACEBACK 環境變數或透過呼叫 debug.SetTraceback 函式進行配置。

cgo 使用者應該注意共享 Go 和 C 程式碼之間的指標規則發生了重大變化。這些規則旨在確保此類 C 程式碼能夠與 Go 的垃圾回收器共存,並在程式執行期間進行檢查,因此程式碼可能需要更改以避免崩潰。有關詳細資訊,請參閱 釋出說明cgo 文件

編譯器、連結器和 go 命令具有新的 -msan 標誌,類似於 -race,僅在 linux/amd64 上可用,它支援與 Clang MemorySanitizer 進行互動。這對於測試包含可疑 C 或 C++ 程式碼的程式非常有用。您可以在使用新的指標規則測試 cgo 程式碼時嘗試一下。

使用 Go 1.6 構建的 Go 程式的效能與使用 Go 1.5 構建的程式相似。垃圾回收暫停時間比 Go 1.5 更短,但這對於使用大量記憶體的程式尤其明顯。關於編譯器工具鏈的效能,構建時間應該與 Go 1.5 相似。

sort.Sort 內部的演算法得到了改進,執行速度提高了約 10%,但此更改可能會破壞期望具有相同但可區分元素的特定排序的程式。此類程式應改進其 Less 方法以指示所需的排序,或使用 sort.Stable 來保留相等值輸入的順序。

當然,還有許多其他新增、改進和修復。您可以在全面的 釋出說明 中找到所有這些內容。

為慶祝髮布,世界各地的 Go 使用者組 將於 2 月 17 日舉行釋出派對。在線上,Go 貢獻者將在 golang subreddit 上進行為期 24 小時的問答環節。如果您對專案、釋出或 Go 有任何疑問,請 加入討論

感謝所有為此次釋出做出貢獻的人。祝您程式設計愉快。

下一篇文章:Go 1.7 釋出
上一篇文章:Go 中的語言和區域設定匹配
部落格索引