go - 如何将go指针作为wasm上下文数据传递?

标签 go webassembly

我在看wasmer go ext wasm example code/go-ext-wasm/wasmer/test/imports.go了解如何设置上下文数据。我想将指针作为ContextData传递,最好的方法是什么?

//export sum
func sum(context unsafe.Pointer, x int32, y int32) int32 {
    instanceContext := wasm.IntoInstanceContext(context)
    t := *(*int)(instanceContext.Data())
    log.Print("t: ", t)
    return x + y
}

func testInstanceImport(t *testing.T) {
    imports, err := wasm.NewImports().Namespace("env").Append("sum", sum, C.sum)
    assert.NoError(t, err)

    instance, err := wasm.NewInstanceWithImports(getImportedFunctionBytes("examples", "imported_function.wasm"), imports)
    defer instance.Close()
    assert.NoError(t, err)

    bar := int(2)
    barPtr := &bar

    data := unsafe.Pointer(&bar)
    instance.SetContextData(data)
    log.Printf("bar %v, barPtr %v", bar, barPtr)
    add1, exists := instance.Exports["add1"]
    assert.Equal(t, true, exists)

    result, err := add1(1, 2)
    log.Print("Result: ", result)
    assert.Equal(t, wasm.I32(4), result)
    assert.NoError(t, err)
}

它为sum函数中的上下文提供预期值2。但是,当我将data := unsafe.Pointer(&bar)更改为data := unsafe.Pointer(&barPtr)时,我会得到一个:runtime error: cgo argument has Go pointer to Go pointer错误。
当我用GODEBUG=cgocheck=0运行它时,它就工作了。我应该关注运行这个标志吗?我想做的是个坏主意吗?我有一个结构包含一个指针,我需要将其作为ContextData传递,使用GODEBUG=cgocheck=0是一个坏主意吗?

最佳答案

我在这里找到了解决方案:cgo: Go pointers in Go memory
注册表示例(可选)解决了我的问题。谢谢。

关于go - 如何将go指针作为wasm上下文数据传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57542983/

相关文章:

file - 如何使用 golang Rest api 将文件或图像路径 url 返回到 forntend?

node.js - 在 Node.js 中运行 C++ Wasm

Blazor 访问硬件

python - Heroku WebAssembly。运行 python 服务器

rust - 使用 web_sys::HtmlButtonElement 失败

javascript - 如何协调宿主 JS 和 Wasm 模块之间的内存访问?

postgresql - 如何保存结构体数组

go - 如何跟踪执行流程(正在调用的函数)

mongodb - 只用 Mongodb 和 Golang 返回查找的文档

go - Golang-为什么总是ItoA在返回字符串时删除初始0