Golang (cgo) - 任意 void* 接口

我正在包装一个 C 库,该库具有一个带有 void* 数据字段的结构,可用于任意保存数据。用惯用的 Go 包装它的最佳方法是什么(如果有可能的话)?


该结构非常简单:


typedef struct _Foo {

    void * data;

} Foo;

我希望做这样的事情:


type Foo C.Foo


func (f *Foo) SetData(data interface{}) {

    f.data = unsafe.Pointer(&data)

}


func (f *Foo) Data() interface{} {

    return (interface{})(unsafe.Pointer(f.data))

}

这不起作用,无论如何显然是错误的方法。


我已经使用 []byte 源成功地设置了一个带有长度字段的 void* 数据,但是这个无长度的接口让我无法理解。


呼如林
浏览 437回答 2
2回答

慕容708150

如果您使用 的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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go