是否可以从 JS 显式调用导出的 Go WebAssembly 函数?

2024-04-28

是否可以调用 Go WebAssembly 函数,除了main,在 JavaScript 中?

让我先展示一下我做了什么。我的Go函数定义如下:

package main

import "fmt"

func main() {
    fmt.Println("it works!")
}

func add(a, b int) int {
    return a + b
}

我只能调用main功能:

const go = new Go();

const data   = await fetch("http://localhost:3333/main.wasm");
const result = await WebAssembly.instantiateStreaming(data, go.importObject);

go.run(result.instance);

返回it works!正如预期的那样。

但是,每当我尝试调用add函数,我收到TypeError: Cannot read property 'add' of undefined at Welcome.getWasm,因为两者result.exports, result.instance.exports不包含我的功能。我也尝试过将Go函数大写,但没有成功。

因此,我开始想知道可能出了什么问题——是否有可能从 Javascript 调用随机 Go 函数?或者我可以只调用默认值吗main()功能?


对的,这是可能的。您可以将函数“导出”到全局上下文(即浏览器中的窗口,nodejs 中的全局):

js.Global().Set("add", js.FuncOf(addFunction))

其中“add”是可用于从 Javascript 调用函数的名称 (window.add),“addFunction”是 Go 代码中的 Go 函数,位于 main 旁边。

请注意,“addFunction”必须遵循该方法签名:

package main

import (
    "syscall/js"
)

func addFunction(this js.Value, p []js.Value) interface{} {
    sum := p[0].Int() + p[1].Int()
    return js.ValueOf(sum)
}

func main() {
    c := make(chan struct{}, 0)

    js.Global().Set("add", js.FuncOf(addFunction))

    <-c
}

在“go.run(result.instance);”之后你可以跑。

go.run(result.instance);
add(100,200);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以从 JS 显式调用导出的 Go WebAssembly 函数? 的相关文章

随机推荐