如何从CGO返回struct

如何从CGO返回struct,struct,shared-libraries,cgo,Struct,Shared Libraries,Cgo,我想从C调用一个Go函数,它返回一个结构,在C中我想处理这个结构 目标是用数据填充结构并返回信息。我不知道哪种格式最好通过。我需要在C代码中获取有关返回数据长度的信息,以及结构的每个str和l值 (我调用的函数不是strings.Split())。它更复杂,但我需要的返回值是char*和int) 我的围棋来源: package main import "C" import ( "fmt" "strings" ) t

我想从C调用一个Go函数,它返回一个结构,在C中我想处理这个结构

目标是用数据填充结构并返回信息。我不知道哪种格式最好通过。我需要在C代码中获取有关返回数据长度的信息,以及结构的每个
str
l

(我调用的函数不是
strings.Split())
。它更复杂,但我需要的返回值是
char*
int

我的围棋来源:

package main

import "C"
import (
    "fmt"
    "strings"
)


type retvalue struct {
    str *C.char
    l   int
}

// This is what I want to achieve (or something similar):
// func Split(input *C.char) []retvalue {
//    ...
//    ...
//    return ret
// }

//export Split
func Split(input *C.char) {
    all := strings.Split(C.GoString(input), ",")
    ret := []retvalue{}
    for _, str := range all {
        ret = append(ret, retvalue{str: C.CString(str), l: len(str)})
    }
    fmt.Printf("%#v\n", ret)
    // return ret
}

func main() {}
这是我的C代码:

#include "libsplitter.h"

int main(int argc, char const *argv[])
{
    char* input="Hello,nice,world";
    Split(input);
    // do something with the return values from my Split()
    return 0;
}
我使用


我找到了解决办法

我的C文件:

#包括“libsplitter.h”
#包括
#包括
int main(int argc,char const*argv[]{
结构拆分值*sv;
sv=拆分(“你好,尼斯,世界”、“,”);
printf(“%d\n”,sv->count);
字符**cptr=sv->拆分;
int*i=sv->长度;
对于(大小j=0;jcount;j++)
{
printf(“%zu%s%d\n”,j,*cptr,*i);
cptr++;
i++;
}
自由(sv->拆分);
自由(sv->长度);
返回0;
}
和我的Go文件:

主程序包
/*
结构拆分值{
字符**分裂;
整数*长度;
整数计数;
};
*/
输入“C”
进口(
“字符串”
“不安全”
)
//出口分割
func拆分(原始*C.char,拆分*C.char)*C.struct\u拆分值{
inputstring:=C.GoString(原始)
splitstring:=C.GoString(split)
goResult:=strings.Split(inputstring,splitstring)
尺寸:=len(goResult)
cLenghtsInt:=C.malloc(C.size\u t(size)*C.size\u t(unsafe.Sizeof(C.int(0)))
csplitedstrings:=C.malloc(C.size\u t(size)*C.size\u t(unsafe.Sizeof(uintptr(0)))
returnStruct:=(*C.struct_splitvalues)(C.malloc(C.size_t(unsafe.Sizeof(C.struct_splitvalues{})))
整数:=(*[1
go build -o libsplitter.dylib -buildmode=c-shared main.go
cc splitit.c -o splitit -lsplitter -L.
LD_LIBRARY_PATH=$PWD ./splitit
3
0 hello 5
1 nice 4
2 world 5