gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:14:23 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com