Go WASM 导出函数

Lex*_*Lex 9 go webassembly

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

package main

import (
    "fmt"
)

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

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

Run Code Online (Sandbox Code Playgroud)

我正在建设

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

它会生成 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"
Run Code Online (Sandbox Code Playgroud)

我期待看到类似的东西

func[137] <MyFunc> -> "MyFunc"
Run Code Online (Sandbox Code Playgroud)

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

在 Rust 中,包含#[no_mangle]pub extern "C" 保持该功能在 wasm-pack 的输出中可用。我正在寻找与 Go 类似的东西。

bla*_*een 9

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

TinyGo 支持//export <name>或 别名//go:export <name>注释指令 来完成您正在寻找的操作。

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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


标准 Go 编译器正在进行关于复制 TinyGo 功能的公开讨论。tl;dr 似乎可以通过将 funcs 设置为 JS 全局命名空间来实现这一点,使用js.Global().Set(...)