Как использовать идентичные типы C из разных пакетов? - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь использовать привязки 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.Тем не менее, я не могу заставить его работать.

Как правильно «согнуть» это, чтобы он скомпилировал и работает?

1 Ответ

0 голосов
/ 15 февраля 2019

Для тех, кто заинтересован, я понял это.

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

Может быть, это можно сделать проще, но это работает.

...