我正在尝试使用 cairo 绑定(bind)(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
的解决方法。但是,我无法让它工作。
我如何正确地“弯曲”它以便编译和工作?
最佳答案
对于那些感兴趣的人,我已经弄清楚了。
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)
...
也许它可以更简单地完成,但这行得通。
关于go - 如何使用来自不同包的相同 C 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54666566/