是否可以调用 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(使用前将#替换为@)