Go WASM 导出函数

Go WASM export functions

我想创建一个 .wasm 文件,它仍然具有编译时导出的函数名称。

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Main")
}

func MyFunc() {
    fmt.Println("MyFunc")
}

我正在用

构建
GOOS=js GOARCH=wasm go build -o main.wasm

生成 wasm 文件(Go 本身就以 wasm 为目标真是太棒了)。

但是使用 wabt 并进行对象转储会暴露这些功能。

Export[4]:
 - func[958] <wasm_export_run> -> "run"
 - func[959] <wasm_export_resume> -> "resume"
 - func[961] <wasm_export_getsp> -> "getsp"
 - memory[0] -> "mem"

我期待看到类似

的内容
func[137] <MyFunc> -> "MyFunc"

有谁知道如何在 Go WASM 中导出函数?

在包含 #[no_mangle]pub extern "C" 的 rust 中,使用 wasm-pack 使函数在输出中可用。我正在寻找与 Go 类似的东西。

如果您打算在 Go 中编写大量 WASM,您可能需要考虑使用 TinyGo 进行编译,这是一个用于嵌入式和 WASM 的 Go 编译器。

TinyGo 支持 //export <name> 或别名 //go:export <name> 注释指令来满足您的需求。

我正在复制粘贴 TinyGo 的第一个示例 WASM docs:

package main

// This calls a JS function from Go.
func main() {
    println("adding two numbers:", add(2, 3)) // expecting 5
}

// ...omitted

// This function is exported to JavaScript, so can be called using
// exports.multiply() in JavaScript.
//export multiply
func multiply(x, y int) int {
    return x * y;
}

然后你构建它:tinygo build -o wasm.wasm -target wasm ./main.go


标准的 Go 编译器有一个 ongoing open discussion 关于复制 TinyGo 的特性。 tl;dr 似乎是您可以通过使用 js.Global().Set(...)

将 funcs 设置为 JS 全局命名空间来实现此目的