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

标签 go cgo

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

相关文章:

string - 根据语言环境将货币/浮点字符串解析为浮点类型

pointers - 修复数组替换中引用不正确的 slice

go - 编码无法从 Go 访问的 C 对象

go - C char name[8] 到 GoLang Name [8]byte

winapi - 从 unsafe.Pointer 获取特定 byte slice 的最佳(最安全 + 最高性能)方法是什么

go - 在结构的字段上实现 Redigo Scanner 接口(interface)

go - 如何使用 golang 和 excelize 将列添加到现有的 excel 工作表?

go - 如何重定向到一个网址

go - CGO : Undefined symbols for architecture x86_64

go - 导入cgo时无法运行init()函数,且导入 “C”