假设有一个 CGo 包,其结构定义如下:
package test
...
type Test struct {
Field *C.C_Test
}
...
现在假设我从其他地方得到unsafe.Pointer
的我知道指向C_Test
C 结构。
我是否正确理解在除 之外的包中完全没有办法从值创建新test.Test
实例?unsafe.Pointer
test
尝试使用类似&test.Test{ptr}
, where ptr
is unsafe.Pointer
value 之类的东西,由于字段值中的消息显而易见的原因而失败cannot use ptr (type unsafe.Pointer) as type *test._Ctype_C_Test
,并且类型转换为*test._Ctype_C_Test
也无法正常工作,因为此类型未导出。
而且我认为让我的另一个模块使用 CGo 并在其中重新定义相同的 C 结构也不起作用,因为该包将具有类似client._Ctype_C_Test
但test.Test
requires的内容test._Ctype_C_Test
,并且从类型检查器的角度来看它们是不同的。
一些背景知识:当我使用库时,我需要一种方法来创建这种GtkBuilder
结构go-gtk
。
它的GtkBuilder.GetObject(name)
方法返回*GObject
指针,该指针又包含unsafe.Pointer
我需要以某种方式转换为gtk.GtkEntry
结构的字段。gtk.GtkEntry
本身包含类型的隐式字段,该字段具有类型gtk.GtkWidget
的显式字段*C.GtkWidget
,因此我需要转换unsafe.Pointer
为*C.GtkWidget
,但我不能,正如我在上面的简单示例中所描述的那样。
更新:这是我试图强制工作的代码:https ://gist.github.com/4141343