次のように定義された構造体を持つ CGo パッケージがあるとします。
package test
...
type Test struct {
Field *C.C_Test
}
...
ここで、別の場所から、 C 構造unsafe.Pointer
を指していることがわかっているものを取得したとします。C_Test
以外のパッケージにある場合、値から新しいインスタンスを作成する方法はまったくないことを正しく理解していますか?test.Test
unsafe.Pointer
test
のようなものを使用しようとすると&test.Test{ptr}
、フィールド値にメッセージが表示され、明らかな理由で失敗します。また、この型はエクスポートされないため、型変換ptr
もunsafe.Pointer
うまくいきません。
そして、他のモジュールで CGo を使用するようにし、その中で同じ C 構造を再定義することも機能しないと思います。なぜなら、そのパッケージには のようなものがありますが必要であり、それらはタイプチェッカーの観点とは異なるからです。cannot use ptr (type unsafe.Pointer) as type *test._Ctype_C_Test
*test._Ctype_C_Test
client._Ctype_C_Test
test.Test
test._Ctype_C_Test
いくつかの背景:ライブラリで使用GtkBuilder
するときに、そのような構造を作成する方法が必要です。
そのメソッドは、構造体などに変換する必要があるフィールドを含むポインターを返します。それ自体には、 typeの明示的なフィールドを持つtype の暗黙的なフィールドが含まれているため、 に変換する必要がありますが、上記の簡単な例で説明したように変換できません。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