使用 CGO 将 Go 嵌套结构数组转换为 C?

Translate a Go nested array of struct to C using CGO?

我正在尝试在 Go 中创建一个结构,其中一个子结构是一个结构数组,然后使用 CGO 将其转换为 C。

我在 Go 中尝试过类似的东西

*/
typedef struct FileInfo{
    int64_t Size;
    char *Name;
}FileInfo;

typedef struct Result{
    FileInfo **files;
}Result;

int64_t GetResult(void **presult, FileInfo **files) {
    Result *result = (Result *)malloc(sizeof(Result));
    result->files=files;

    *presult = result;

    int64_t ptr = (int64_t)result;

    return ptr;
}
*/
import "C"
func Run() {
    var arr []*C.struct_FileInfo

    ai := C.struct_FileInfo{
        Size: C.int64_t(1234),
        Name: C.CString("some name"),
    }

    arr = append(arr, &ai)

    var presult unsafe.Pointer
    ptr := C.GetResult(&presult, &arr[0])

    println("\nResult struct pointer: %v", ptr)
}

它引发了 panic: runtime error: cgo argument has Go pointer to Go pointer 错误。

如何修复此错误?

更新:

工作操场url:https://play.golang.org/p/vpLddEyY8kI

问题

  • arr 是一片指针 (*C.struct_FileInfo)。
  • &arr[0] 获取该切片的第一个元素(指向)的地址。
  • ai变量的地址成为arr的第一个元素,由Go分配。

因此:

  • arr[0]包含&ai,这是Go分配的指向C.struct_FileInfo的指针。
  • arr 也由 Go 管理,因此 &arr[0] 是“指向 Go 指针的 Go 指针”。

请仔细阅读this

可能的解决方案

一个解决方案是调用C.malloc分配足够的字节来存储C.struct_FileInfo。这样,您将拥有指向 C 指针的 Go 指针 (&arr[0]),这很好。

不要忘记 C.free 完成该记忆后。