我正在尝试构建一个带有返回切片的函数的 go 共享库。
如何使用 C 代码中的切片?
package main
import "C"
type T struct {
A C.int
B *C.char
}
//export Test
func Test() []T {
arr := make([]T, 0)
arr = append(arr, T{C.int(1), C.CString("a")})
arr = append(arr, T{C.int(2), C.CString("abc")})
return arr
}
func main() {}
go build -o lib.so -buildmode=c-shared main.go
我现在有一个lib.so
and a lib.h
打印数组值的 C 代码是什么?
#include <stdio.h>
#include "lib.h"
typedef struct {
int A;
char* B;
} T;
int main() {
GoSlice a = Test();
for (int i = 0; i < 2; i++){
printf("%s\n", ((T *)a.data)[i].B);
}
}
gcc -o main main.c ./lib.so
首先,C 不知道 Go 切片类型,也不知道如何操作它,因此您应该像在 C 中一样返回一个数组指针。
您也无法在 Go 中分配切片,然后返回指向已分配内存的指针,而没有某种方法来防止它被 GC 回收。在此示例中,在 C 中分配数组可能更简单。
p := C.malloc(2 * C.size_t(unsafe.Sizeof(T{})))
// convert the C pointer to a slice of `[]T` for convenient indexing
arr := unsafe.Slice((*T)(p), 2)
arr[0].A = C.int(1)
arr[0].B = C.CString("a")
arr[1].A = C.int(2)
arr[1].B = C.CString("abc")
当然,您还需要处理数组大小,可以通过将其组合成一个结构(就像处理字符串一样)来实现,或者接受第二个指针参数来设置返回大小。
不要忘记,既然您在 C 中分配内存,那么您也有责任释放它。这适用于malloc
致电,以及C.CString
arrays.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)