我正在尝试使用cairo绑定(Go软件包),该绑定定义了其中具有C类型和C函数的包装器结构,但无法使其起作用。
cairo包定义了一个上下文:
NumberPicker starttime = (NumberPicker) findViewById(R.id.timeListview);
starttime.setMaxValue(47);
String[] time = {"12:00 AM", "12:30 AM", "01:00 AM", "01:30 AM", "02:00 AM", "02:30 AM", "03:00 AM","11:00 PM", "11:30 PM"};
starttime.setDisplayedValues(time);
starttime.setWrapSelectorWheel(true);
然后,在主包中,我想使用它的指针:
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
。但是,go编译器不同意:
cr.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
,也就是说,包名称空间是该类型的一部分。
我发现https://github.com/golang/go/issues/13467,它讨论了结合使用反射包和*C.cairo_t
的解决方法。但是,我无法使其正常工作。
我如何正确地“弯曲”它,使其编译并工作?
答案 0 :(得分:0)
对于那些感兴趣的人,我已经弄清楚了。
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)
...
也许可以更简单地完成此操作,但这可行。