Go 1.18 中即將出現的功能特性

Cluas發表於2021-11-09

Go 1.18 將是 Go 語言的一個重要版本,它將包含一些令我興奮的主要功能。即將到來的版本計劃在 2022 年初發布。第一個測試版應該會在一個月內推出。讓我們來提前看看將有哪些新功能被加入到這個版本中。

範型

期待已久的泛型支援將在 Go 1.18 中出現。Go 中缺乏泛型是開發者社群批評的最大問題。從設計階段到將在 Go 1.18 中出現的實際實現,花了好幾年時間。

這個話題太大,無法在這篇博文中詳細解釋。已經有很多關於它的好博文了。以下是我最喜歡的一篇,涵蓋了所有相關方面: https://bitfieldconsulting.com/golang/generics。 如果你想玩 Go 泛型,這裡有一個託管的 Go Playground 可供選擇。

工作空間(WORKSPACES)

工作區使開發者能夠更容易地同時處理多個模組的工作。在 Go 1.17 之前,這隻能通過go.modreplace指令來實現,如果你有很多模組在開發中,使用這個指令會很痛苦。同樣令人痛苦的是,每次你想提交你的程式碼時,你必須刪除replace行,以便能夠使用一個模組的 穩定/釋出 版本。

有了工作區,這些開發情況的處理就簡單多了。一個名為go.work的新檔案可以被新增到專案中,它包含了依賴模組的本地開發版本的路徑。go.mod保持不動,不需要使用replace指令。

go 1.17

directory (
./baz // contains foo.org/bar/baz
./tools // contains golang.org/x/tools
)

replace golang.org/x/net => example.com/fork/net v1.4.5

在通常的專案情況下,建議不要提交go.work檔案,因為它的主要使用情況是本地開發。

如果你想在本地構建你的專案而不使用工作區功能,你可以通過提供以下命令列標誌來實現:

go build -workfile=off

通過像這樣執行go build命令,你可以確保你的專案在構建時沒有依賴模組的本地開發版本。

官方模糊測試支援

在 Go 1.18 中也將提供正式的模糊測試支援。模糊功能將被視為實驗性的,API 還沒有被 Go 1 的相容性承諾所覆蓋。它應該作為一個概念驗證,Go 團隊請求社群提供反饋。

如果你還沒有聽說過模糊測試,測試版公告的博文對它進行了很好的描述:

模糊測試是一種自動化測試,它持續操縱程式的輸入,以發現問題,如 panic 或 bug。這些半隨機的資料突變可以發現現有單元測試可能遺漏的新的程式碼覆蓋範圍,並發現被忽略或者未被覆蓋的邊緣案例的錯誤。由於模糊測試可以接觸到這些邊緣案例,所以模糊測試對於發現安全隱患和漏洞特別有價值。

你可以在這裡閱讀 Katie Hockman 的設計文件。 還有Go Time 播客集,與 Katie 一起討論的這個話題。

新的軟體包 net/netip

新包net/netip增加了一個新的 IP 地址型別,與net.IP型別相比,它有很多優點。 簡單來說:它很小,可比較,而且沒有記憶體分配操作。 已經有一篇來自 Brad Fitzpatrick 的詳細博文介紹了所有的細節。如果你喜歡視訊,在Brad 在 FOSDEM 2021 的演講 中也有一段介紹,從時間 18:45 開始觀看。

更快的(?)go fmt 執行

go fmt命令現在以並行方式執行格式化。正如Github issue中描述的那樣,格式化大型程式碼庫的速度應該會快很多。

但我很困惑為什麼在我的機器上進行第一次測試時沒有發現快很多,它變得更糟糕了。

我在我的 Macbook Pro 2019(2,6 GHz 6-Core Intel Core i7, 16 GB 2667 MHz DDR4) 的CockroachDB 倉庫上用以下命令進行測試:

time go test ./pkg/...

使用 Go 1.17,花了56 秒來格式化所有檔案。使用最新的gotip版本,花了1 分 20 秒。我還不得不提高我機器上的 ulimit,以防止崩潰。讓我們看看這個功能在穩定版之前是如何發展的。

試用即將推出的特性功能

你也可以直接在你的機器上玩最新的實驗性 Go 版本gotip。當你已經安裝了穩定版本的 Go,你只需要執行:

go install golang.org/dl/gotip@latest
gotip download

當安裝成功後,你可以像通常的go命令一樣使用gotip命令的所有子命令。

這篇博文並沒有涵蓋 Go 1.18 中的所有新功能。如果你想閱讀所有的錯誤修復和新功能特性,你可以在這裡看 Go 1.18 的問題列表。

文中提到的連結

更多原創文章乾貨分享,請關注公眾號
  • Go 1.18 中即將出現的功能特性
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章