是否可以用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.exports
和result.instance.exports
都不包含我的函数。我也尝试大写Go函数,但无济于事。
因此,我开始怀疑是什么问题– 甚至可以从Javascript调用随机Go函数吗?还是只能调用默认的main()
函数? >
答案 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);