我正在包装一个 C 库,该库具有一个带有 void* 数据字段的结构,可用于任意保存数据。用惯用的 Go 包装它的最佳方法是什么(如果有可能的话)?该结构非常简单:typedef struct _Foo { void * data;} Foo;我希望做这样的事情:type Foo C.Foofunc (f *Foo) SetData(data interface{}) { f.data = unsafe.Pointer(&data)}func (f *Foo) Data() interface{} { return (interface{})(unsafe.Pointer(f.data))}这不起作用,无论如何显然是错误的方法。我已经使用 []byte 源成功地设置了一个带有长度字段的 void* 数据,但是这个无长度的接口让我无法理解。
2 回答
慕容708150
TA贡献1831条经验 获得超4个赞
如果您使用 的interface地址,您将使用值类型的地址(大致struct { tInfo *typeInfo, payload uintPtr}),而不是接口“装箱”的数据。如果它们适合机器字,有效载荷字段可以保存真实数据,否则该字段保存指向实际有效载荷的指针。但这些是实施细节,不应直接与 IMO 合作。
我会去非通用,比如(未经测试的代码,仅限架构):
func (f *Foo) SetT(p *T) {
(*C.Foo)(f).data = unsafe.Pointer(p)
}
和
func (f *Foo) GetT() *T {
return (*T)((*C.Foo)(f).data)
}
- 2 回答
- 0 关注
- 430 浏览
添加回答
举报
0/150
提交
取消