如何使用来自不同包的相同 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)
...
也许可以更简单地完成,但这很有效。
我正在尝试使用 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)
...
也许可以更简单地完成,但这很有效。