猿问

如何使用来自不同包的相同 C 类型?

我正在尝试使用 cairo 绑定(Go 包),它定义了一个包装结构,其中包含 C 类型和 C 函数,但无法使其工作。


cairo 包定义了一个上下文:


package cairo

...

type Context struct {

    Ptr *C.cairo_t

}

...

然后,从主包中,我想使用它的指针:


package main

...

cr := cairo.Create(surf.Surface)

layout := C.pango_cairo_create_layout(cr.Ptr)

...

accepts ,这是应该的C.pango_cairo_create_layout。但是,go 编译器不同意:*C.cairo_tcr.Ptr


./main.go:114:157: cannot use cr.Ptr (type *cairo._Ctype_struct__cairo) as type *_Ctype_struct__cairo in argument to func literal

可以看出,cr.Ptr是类型*cairo.C.cairo_t而不是*C.cairo_t类型,即包命名空间是类型的一部分。


我找到了https://github.com/golang/go/issues/13467,它讨论了使用 reflect 包和unsafe.Pointer. 但是,我无法让它工作。


我如何正确地“弯曲”它以便它编译和工作?


慕村225694
浏览 91回答 1
1回答

守候你守候我

对于那些感兴趣的人,我已经弄明白了。package main...cr := cairo.Create(surf.Surface)ptr := (*C.cairo_t)(unsafe.Pointer(reflect.ValueOf(cr.Ptr).Pointer()))layout := C.pango_cairo_create_layout(ptr)...也许可以更简单地完成,但这很有效。
随时随地看视频慕课网APP

相关分类

Go
我要回答