大家好,我是煎鱼。
之前写过一篇关于 Go WebAssembly 的相关文章 《一分钟搞明白!快速掌握 Go WebAssembly》,今天带来一则新消息。
想着 Go 过去了那么多年了,只在 Go1.11 支持了 WebAssembly1.0 的部分功能(js/syscall),还没有完整的支持 WebAssembly System Interface(WASI)。这可真的是大写的尴尬。
基本也没怎么更新新特性。这也侧面说明了 WebAssembly 在多语言适配的路途上,还是比较艰辛的。
Go1.21 支持 WASI
没想到,刚写完没多久。这脸啪啪的就被抽了。因为...在 Go1.21 起,Go 将会支持 WASI 的特性。预计先支持 WASI Preview1[1] 标准,后续 WASI Preview2 成熟后会继续支持新标准。
此处变更会增加新的端口和方式,如下:
Go 编译和运行:可以使用
GOOS=wasip1 GOARCH=wasm
,可以支持wasi_snapshot_preview1
标准的 API。未来大概率还会出现 wasip2、wasip3 等互相不兼容的情况,因为 WASI 本身并还未完全成熟。新增
syscall
包中可以使用的指令:go:wasmimport
,提供 syscall 与 WASI 交互的方式。
最小 Demo 体验
Go 最新版本体验的话,可以安装 gotip(建议科学上网)。命令如下:
$ go install golang.org/dl/gotip@latest
$ gotip download
一个简单的 Go Wasm Demo:
package main
func main() {
println("脑子进煎鱼了")
}
将上述 Go 程序编译为 .wasm 文件。如下编译命令:
$ GOARCH=wasm GOOS=wasip1 gotip build -o app.wasm main.go
快速运行体验的话,可以使用 tetratelabs/wazero[2] 开源项目,在 Go 里比较火,相对好上手。
安装命令(建议科学上网):
$ curl https://wazero.io/install.sh | sh
tetratelabs/wazero info checking GitHub for latest tag
tetratelabs/wazero info found version: 1.0.3 for v1.0.3/darwin/amd64
tetratelabs/wazero info installed ./bin/wazero
安装完毕后,运行 ./bin/wazero run app.wasm
。就会输出结果:脑子进煎鱼了。
一个快速入门 Go1.21 WASM WASI 的体验就完成啦!未来 Go 在 WASM 上的开发空间也逐步扩大了。
总结
WebAssembly 在 Go 语言中的适配,总体上是忧喜参半的。因为你可以看到 syscall/js 库其实已经提交了 5 年之久,很多人提出不少问题。Go 核心团队本身并没有太多的意愿维护和更新他。
值得开心的是,截止 2023 年。在 Go WASI 上还是有关注热度的。因此有像原提案作者会持续更新 WAS 的 P1P2 的支持。作为一门新技术,我们需要持续关注。但不太建议使用过深,我们需要关注 “可持续发展” 的长期考量。
无论如何,欢迎跑通和学习这一个 Demo!
推荐阅读
写在 2023 年初的后端社招面试经历(四年经验):字节 米哈游 富途 猿辅导
Go 的一些有趣数据:中国最多人用、开发者年轻;PHP 明显下滑的趋势
快速上手 Go CGO,掌握在 Go 里写 C!
参考资料
[1]
WASI Preview1: https://github.com/WebAssembly/WASI/blob/b44552d84267af4d5899ed32364966740ef1846e/legacy/preview1/docs.md
[2]tetratelabs/wazero: https://github.com/tetratelabs/wazero
关注和加煎鱼微信,
一手消息和知识,拉你进技术交流群👇
你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路。
日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!