go - 如何将 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
一个坏主意吗?
解决方案
推荐阅读
- javascript - Discord.js awaitMessages 不返回任何内容并阻止代码
- pattern-matching - 如何修复 TypeError:调用的匹配模式必须是 Python 3.10 中的类型
- python - 我用 Unity 构建了一个游戏。如何使用python玩这个游戏?
- react-native - React Native - 提供全局主题的最佳方式是什么?
- date - 使用字符串类型比较 Go 中的两个日期
- javascript - 按下按钮后在函数中传递表格
- javascript - 如何在 HTML 中设置 INLINE EVENTS 选项
- git - 如何在分叉或镜像仓库中保持所有分支和标签同步?
- ios - 面临 Apple Store Connect 操作错误
- javascript - 如何在循环中调用下一个变量?