【发布时间】:2016-06-26 06:02:49
【问题描述】:
我正在尝试与 Go 中的一些 C 代码进行交互。使用 cgo,这一直是相对简单的,直到我遇到这种(相当常见的)情况:需要将指针传递给本身包含指向某些数据的指针的结构。如果不求助于将结构的创建放入 C 代码本身,我似乎无法从 Go 中弄清楚如何做到这一点,我不想这样做。这是一个说明问题的sn-p:
package main
// typedef struct {
// int size;
// void *data;
// } info;
//
// void test(info *infoPtr) {
// // Do something here...
// }
import "C"
import "unsafe"
func main() {
var data uint8 = 5
info := &C.info{size: C.int(unsafe.Sizeof(data)), data: unsafe.Pointer(&data)}
C.test(info)
}
虽然编译正常,但尝试运行它会导致:
panic: runtime error: cgo argument has Go pointer to Go pointer
在我的例子中,传递给 C 调用的数据不会在调用之后持续存在(即,有问题的 C 代码会深入到结构中,复制它需要的内容,然后返回)。
【问题讨论】: