Golang 到 wasm 编译

0x1*_*111 3 go webassembly

我使用以下命令将 Golang 代码编译为 wasm

GOOS=js GOARCH=wasm go build -o main.wasm
Run Code Online (Sandbox Code Playgroud)

尝试使用 wasmtime 执行时出现以下错误

wasmtime main.wasm 
Error: failed to run main module `main.wasm`

Caused by:
    0: failed to instantiate "main.wasm"
    1: unknown import: `go::debug` has not been defined

Run Code Online (Sandbox Code Playgroud)

当使用 wasm3 执行时,我得到

wasm3 main.wasm 
Error: function lookup failed ('_start')
Run Code Online (Sandbox Code Playgroud)

这些错误意味着什么以及如何修复它们?

Tac*_*tes 5

目前还没有办法在浏览器之外使用 go 编译器生成 wasm。您的示例main.wasm中的 旨在与垫片一起使用wasm_exec.js。不过,有多种方法可以在 Node 中使用它。是我之前关于同一主题的回答。所以,你的选择是:

  1. 使用 Node,如上面链接的问题所示
node wasm_exec.js main.wasm
Run Code Online (Sandbox Code Playgroud)
  1. 使用tinygo编译,并支持wasi
tinygo build -target=wasi -o main.wasm main.go
Run Code Online (Sandbox Code Playgroud)

wasmtime应该可以正常运行。

  1. 秘密选项三:Go 实际上对浏览器之外的 wasm有非常非常前沿的支持。我认为 go 编译器的任何发行版本都没有启用此功能,因此这意味着您可能必须从源代码编译 go。编译后,你的命令应该变成:
GOOS=wasip1 GOARCH=wasm go build -o main.wasm
Run Code Online (Sandbox Code Playgroud)

没有其他变化。

对于您的问题,我会说选择(1),以便至少有一些工作,以及(2)如果您想使用wasmtime. 如果您想等待而不自行编译,那么新的 go 版本也应该很快就会发布。

编辑:

我有时间自己研究一下。看来选项 3 自己做并不难:

我按照此处的说明从源获取最新go版本,这些源只是:

node wasm_exec.js main.wasm
Run Code Online (Sandbox Code Playgroud)

您必须go已经安装,才能进行引导,但任何最新版本都可以。遵循这些说明后,您可以gotip像使用一样go。所以你的命令变成:

tinygo build -target=wasi -o main.wasm main.go
Run Code Online (Sandbox Code Playgroud)

作为wasmtime支持wasi,您应该能够运行您的程序,而无需对命令进行任何其他修改。

编译gotip也不应该花费太多,只要你有一台足够强大的计算机。