Я пытаюсь взаимодействовать с некоторым кодом C из Go. Используя cgo, это было относительно просто, пока я не столкнулся с этим (довольно распространенным) случаем: необходимость передать указатель на структуру, которая сама содержит указатель на некоторые данные. Кажется, я не могу понять, как сделать это из Go, не прибегая к созданию структуры в самом коде C, чего я бы предпочел не делать. Вот фрагмент, который иллюстрирует проблему:
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 копается в структуре, копирует то, что ему нужно, а затем возвращает).