【问题标题】:Go WASM export functionsGo WASM 导出函数
【发布时间】:2021-08-30 20:14:22
【问题描述】:

我想创建一个.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 中导出函数吗?

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

【问题讨论】:

    标签: go webassembly


    【解决方案1】:

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

    TinyGo 支持 //export &lt;name&gt; 或别名 //go:export &lt;name&gt; 注释指令,可以满足您的需求。

    我正在复制粘贴 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 编译器有一个关于复制 TinyGo 功能的ongoing open discussion。 tl;dr 似乎是您可以通过将 funcs 设置为 JS 全局命名空间来实现这一点,js.Global().Set(...)

    【讨论】:

    • 太棒了!非常感谢你做到了!使用 TinyGo 编译产生 - func[146] &lt;MyFunc&gt; -&gt; "MyFunc"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多