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 新版本特性的系列基本已经完结,本次新版本还是带来了许多新的创新小突破的。

欢迎大家有需要的同学可以尽快开始用起来。

推荐阅读

关注和加煎鱼微信,

一手消息和知识,拉你进技术交流群👇

dfb848e8291a409ae06cfb5be06feeb8.jpeg

e1924d0606ec32f4a313206019e9c577.png

你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路

日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!

原创不易 点赞支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值