【发布时间】:2012-11-12 04:37:40
【问题描述】:
假设有一个 CGo 包,其结构定义如下:
package test
...
type Test struct {
Field *C.C_Test
}
...
现在假设我从其他地方得到unsafe.Pointer,我知道它指向C_Test C 结构。
我是否理解正确完全没有办法从unsafe.Pointer 值创建新的test.Test 实例,而在包中其他而不是test ?
尝试使用&test.Test{ptr} 之类的东西,其中ptr 是unsafe.Pointer 值,由于字段值中出现消息cannot use ptr (type unsafe.Pointer) as type *test._Ctype_C_Test 的明显原因而失败,并且类型转换为*test._Ctype_C_Test 不能正常工作,因为这种类型未导出。
而且我认为让我的另一个模块使用 CGo 并在其中重新定义相同的 C 结构也不起作用,因为该包将具有类似 client._Ctype_C_Test 但 test.Test 需要 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
【问题讨论】:
标签: types type-conversion go