为了账号安全,请及时绑定邮箱和手机立即绑定

Golang (cgo) - 任意 void* 接口

Golang (cgo) - 任意 void* 接口

Go
呼如林 2021-06-04 18:37:26
我正在包装一个 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)

}


查看完整回答
反对 回复 2021-06-07
  • 2 回答
  • 0 关注
  • 430 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信