如何从CGO返回struct
我想从C调用一个Go函数,它返回一个结构,在C中我想处理这个结构 目标是用数据填充结构并返回信息。我不知道哪种格式最好通过。我需要在C代码中获取有关返回数据长度的信息,以及结构的每个如何从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
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