英文:
How to return object from tinygo webassembly target
问题
我正在使用tinygo生成一个简单函数的wasm:
//export onInput
func onInput() map[string]interface{} {
return map[string]interface{}{
"key": 60,
"remove": 1,
}
}
然后我使用wasm目标构建,使用tinygo命令如下:
tinygo build -o main.wasm -target wasm ./main.go
当我调用wasm.exports.onInput()
方法时,我得到一个数字,例如:102752
如何将JS对象作为返回值获取,如下所示:
{ key: 60, remove: 1 }
// 或者如果可能的话,返回数组 [60, 1]
注意:
tinygo文档中提到:
WebAssembly目标不能直接返回JavaScript无法处理的变量(例如i64、struct、多个返回值等)。相反,它们被存储在由调用者作为第一个参数传递的指针中。
如果这是问题的原因,我该如何将返回值作为指针从JavaScript传递?
编辑:
我无法弄清楚如何从go函数返回数组、字符串或映射中的任何一个。我愿意接受上述任何一种返回值。
英文:
I am using tinygo to generate a wasm for simple function:
//export onInput
func onInput() map[string]interface{} {
return map[string]interface{}{
"key": 60,
"remove": 1,
}
}
Then I am using wasm target to build using tinygo, as:
tinygo build -o main.wasm -target wasm ./main.go
And when I call the method wasm.exports.onInput()
I am getting a number such as: 102752
How would I get the JS object as a return value like:
{ key: 60, remove: 1 }
// Or array [60, 1] if possible
Note:
The tinygo documentation says:
> The WebAssembly target does not return variables directly that cannot be handled by JavaScript (see above about i64, also struct, i64, multiple return values, etc). Instead, they are stored into a pointer passed as the first parameter by the caller.
If that's the cause of the issue, how would I pass the return value as a pointer from javascript?
Edit
I wasn’t able to figure out how I would return any of: arrays, strings or maps from a go function. I would settle for any of the above.
答案1
得分: 1
根据 tinygo 的 GitHub 上的示例,你可以尝试以下代码:
package main
import "syscall/js"
func main() {
wait := make(chan struct{}, 0)
js.Global().Set("onInput", js.FuncOf(onInput))
<-wait
}
// 注意,此函数没有导出,因为我们在全局注册了这个函数
func onInput(this js.Value, args []js.Value) interface{} {
return js.ValueOf(map[string]interface{}{
"key": 60,
"remove": 1,
})
}
在你的 JavaScript 代码中,只需使用 onInput
,而不需要 wasmModule.instance.exports
前缀。
你可以参考这个链接获取更多信息:https://github.com/tinygo-org/tinygo/blob/138befd8a25d2a5c65e2e740038a8c3a44e95222/src/examples/wasm/slices/wasm.go
英文:
According to example at tinygo github you can try something like this:
package main
import "syscall/js"
func main() {
wait := make(chan struct{}, 0)
js.Global().Set("onInput", js.FuncOf(onInput))
<-wait
}
// note that there is no export as we registered this function in global
func onInput(this js.Value, args []js.Value) interface{} {
return js.ValueOf(map[string]interface{}{
"key": 60,
"remove": 1,
})
}
And in your js code use just onInput
, without wasmModule.instance.exports
prefix
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论