登录
首页 >  Golang >  Go问答

如何在多个包中共享相同的 C 类型?

来源:stackoverflow

时间:2024-03-03 15:09:25 415浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《如何在多个包中共享相同的 C 类型?》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

我正在尝试使用 cairo 绑定(go 包),它定义了一个带有 c 类型的包装器结构,带有 c 函数,但无法使其工作。

cairo 包定义了一个 context:

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

也许可以更简单地完成,但这可行。

到这里,我们也就讲完了《如何在多个包中共享相同的 C 类型?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>