大家好,我是煎鱼。

之前写过一篇关于 Go WebAssembly 的相关文章 《一分钟搞明白!快速把握 Go WebAssembly》,今日带来一则新消息。

想着 Go 过去了那么多年了,只在 Go1.11 支撑了 WebAssembly1.0 的部分功用(js/syscall),还没有完整的支撑 WebAssembly System Interface(WASI)。这可真的是大写的尴尬。

Go1.21 速览:Go 终于打算进一步支持 WebAssembly 了。。。

基本也没怎么更新新特性。这也旁边面说明晰 WebAssembly 在多言语适配的路途上,仍是比较艰苦的。

Go1.21 支撑 WASI

没想到,刚写完没多久。这脸啪啪的就被抽了。由于…在 Go1.21 起,Go 将会支撑 WASI 的特性。估计先支撑 WASI Preview1 规范,后续 WASI Preview2 老练后会继续支撑新规范。

Go1.21 速览:Go 终于打算进一步支持 WebAssembly 了。。。

此处变更会增加新的端口和方法,如下:

  • 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 开源项目,在 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!

文章继续更新,能够微信搜【脑子进煎鱼了】阅览,本文 GitHub github.com/eddycjy/blo… 已录入,学习 Go 言语能够看 Go 学习地图和路线,欢迎 Star 催更。

Go 图书系列

  • Go 言语入门系列:初探 Go 项目实战
  • Go 言语编程之旅:深化用 Go 做项目
  • Go 言语规划哲学:了解 Go 的为什么和规划考虑
  • Go 言语进阶之旅:进一步深化 Go 源码

推荐阅览

  • 写在 2023 年初的后端社招面试经历(四年经验):字节 米哈游 富途 猿教导
  • Go 的一些有趣数据:中国最多人用、开发者年轻;PHP 明显下滑的趋势
  • 快速上手 Go CGO,把握在 Go 里写 C!