Go1-24 新特性:OS 新版本要求、Wasm 功能增強、template 支持迭代器等

大家好,我是煎魚。

新版本 Go1.24 在 2 月 11 號已經正式發佈,如果先前還沒有留到的同學,可以關注下是否跟進了。

先前我們已經更新了多篇新特性介紹。今天將會是最後一篇知識點的收尾。

操作系統要求

Linux 內核版本 >= 3.2

在本次 Go1.24 新版本開始,需要 Linux 內核 3.2 版本或更高版本(劃重點)。

如果公司裏的集羣環境歷史底蘊比較深的,建議升級前檢查一下。(我們就是,提前一個版本升級申請集羣升級了)

因爲 Linux 內核 3.19 是先前較爲常用的一個版本,可能有的集羣環境以前安裝了,就一直沒有再動。就需要提前安排升級。

macOS 版本要求

Go1.24 是能在 macOS 11 Big Sur 上運行的最後一個版本。Go1.25 需要 macOS 12 Monterey 或更高版本。

WebAssembly 功能增強

在 Wasm 發展歷程上,Go 在 1.11 版本首次添加了對編譯爲 Wasm 的支持,通過 js/wasm 端口實現。Go1.21 增加了一個新端口,針對 WASI preview 1 系統調用 API,即新的 GOOS=wasip1 端口。

本次 Go1.24 引入了 go:wasmexport 指令和構建 WebAssembly System Interface(WASI)反應器的能力,增強 Go 對 WebAssembly(Wasm)的進一步能力支持。

使用 go:wasmexport 導出 Go 函數

Go 1.24 引入了新的編譯器指令 go:wasmexport,允許開發者將 Go 函數導出,以便從 Wasm 模塊外部調用,通常由運行 Wasm 運行時的主機應用調用。

該指令指示編譯器在生成的 Wasm 二進制中將被註釋的函數作爲 Wasm 導出。

要使用 go:wasmexport 指令,只需在函數定義上添加:

//go:wasmexport add
func add(a, b int32) int32 { return a + b }

這樣 Wasm 模塊將有一個名爲 add 的導出函數,可供主機調用。

這類似於 cgo 的導出指令,使函數可被 C 調用,但 go:wasmexport 使用了不同且更簡單的機制。

構建 WASI 反應器(Reactor)

WASI 反應器(Reactor)是一個持續運行的 WebAssembly 模塊,可多次被調用以響應事件或請求。與在主函數結束後終止的 “命令” 模塊不同,反應器實例在初始化後保持活躍,其導出功能仍然可訪問。

在 Go 1.24 中,可以使用 -buildmode=c-shared 構建 WASI 反應器:

GOOS=wasip1 GOARCH=wasm go build -buildmode=c-shared -o reactor.wasm

該構建標誌指示鏈接器不生成 _start 函數(命令模塊的入口點),而是生成 _initialize 函數,執行運行時和包的初始化,以及任何導出函數及其依賴項。在調用導出函數之前,必須先調用 _initialize 函數。

通過本次版本支持的新特性,Go 開發可以更輕鬆地創建和導出 Wasm 模塊,構建可擴展的應用程序,並與各種 Wasm 主機環境集成。

text/template 支持 range-over

在標準庫 text/template 中,原有提供:

{{range pipeline}} T1 {{end}}

但是在原有的 pipeline 中,值必須是 array、slice、map 或者是 channel。

在本次 Go1.24 中,將先前支持的 for-range 支持函數(迭代器)和整型迭代也支持到了模版庫裏。

math/rand 隨機數禁用全局種子

在 Go1.24 中,標準庫 math/rand 的全局函數 rand.Seed 將默認變爲 “無操作”(no-op),即調用此函數不再產生實際效果。

此行爲可通過 GODEBUG=randseednop=1 控制。若需恢復舊版行爲,可在代碼中添加 //go:debug randseednop=0 指令(此兼容性支持至少持續到 Go 1.27)。

如果後續需保持確定性隨機數行爲(如科學模擬),應替換 rand.Seed 的使用方式。

我們可以用 rsc 推薦的 r := rand.New(rand.NewSource(s)) 代替 rand.Seed(s)

例如:

import mathrand "math/rand"

var rand = mathrand.New(mathrand.NewSource(seed))

該方式通過局部實例生成隨機數,規避全局狀態衝突。

總結

本次 Go1.24 新版本特性的系列基本已經完結,本次新版本還是帶來了許多新的創新小突破的。

歡迎大家有需要的同學可以儘快開始用起來。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/AnDpsx7WiJH7hsMH19bQng