2 回答
TA贡献1801条经验 获得超16个赞
我问了一个关于golang-nuts的问题,并举例说明了如何做我想做的事情。现在似乎可以正常工作了。这是Ian的答案中的代码:
var t test.Test
p := (*unsafe.Pointer)(unsafe.Pointer(&t.Field))
*p = unsafe.Pointer(u)
因此,所有需要的都是双重铸造unsafe.Pointer,然后再铸造到*unsafe.Pointer。我想出了以下代码来简化分配过程:
func Assign(to unsafe.Pointer, from unsafe.Pointer) {
fptr := (*unsafe.Pointer)(from)
tptr := (*unsafe.Pointer)(to)
*tptr = *fptr
}
func Init(builder *gtk.GtkBuilder) {
messageNameEntryWidget := gtk.GtkWidget{}
Assign(unsafe.Pointer(&messageNameEntryWidget.Widget),
unsafe.Pointer(&builder.GetObject("messageNameEntry").Object))
}
然后,我决定放弃使用GTK,因为这样做很麻烦(),但这与问题无关。
TA贡献1895条经验 获得超7个赞
有点像
foo := test.Test{}
*(unsafe.Pointer)(&foo.Field) = ptr
还测试过吗?我希望它能奏效。(希望如此。金田。)
编辑2012-11-24 13:42 UTC:第二次尝试
package main
/*
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int foo;
char *bar;
} Test_t;
void test_dump(Test_t *test) {
printf(".foo %d, .bar %s\n", test->foo, test->bar);
}
void *test_new(int foo, char *bar) {
Test_t *p = malloc(sizeof(Test_t));
p->foo = foo;
p->bar = bar;
return p;
}
*/
import "C"
import "unsafe"
type Test struct {
Field *C.Test_t
}
func main() {
hello := C.CString("Hello")
defer C.free(unsafe.Pointer(hello))
test := &Test{(*C.Test_t)(C.test_new(42, hello))}
C.test_dump(test.Field)
}
$ go clean && go build && ls
main.go 13535422
$ ./13535422
.foo 42, .bar Hello
$
- 2 回答
- 0 关注
- 287 浏览
添加回答
举报