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

How to use identical C types from different packages?

我正在尝试使用 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)
...

C.pango_cairo_create_layout 接受 *C.cairo_t,这是 cr.Ptr 应该的。但是,go 编译器不同意:

./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,它讨论了结合使用反射包和 unsafe.Pointer 的解决方法。但是,我无法让它工作。

我如何正确地 "bend" 这样编译 并且 有效?

对于那些感兴趣的人,我已经弄明白了。

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)
...

也许可以更简单地完成,但这很有效。