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

时间:2019-05-31 15:45:40

标签: javascript go webassembly

是否可以用JavaScript调用main以外的Go WebAssembly函数?

首先让我展示我的所作所为。我的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.exportsresult.instance.exports都不包含我的函数。我也尝试大写Go函数,但无济于事。

因此,我开始怀疑是什么问题– 甚至可以从Javascript调用随机Go函数吗?还是只能调用默认的main()函数? >

1 个答案:

答案 0 :(得分:1)

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

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

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

请注意,“ 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);