首页 > 解决方案 > 如何将 go 指针作为 wasm 上下文数据传递?

问题描述

我正在查看/go-ext-wasm/wasmer/test/imports.go有关设置上下文数据的 wasmer go-ext-wasm 示例代码。我想将指针作为 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)
}

这给了我求和函数中上下文的预期值 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一个坏主意吗?

标签: gowebassembly

解决方案


推荐阅读