【发布时间】:2019-01-02 16:26:15
【问题描述】:
我正在尝试使用返回切片的函数构建一个 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 和一个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
【问题讨论】:
-
不要将 Go 切片返回给 C 代码,因为 C 代码不知道 Go 切片是什么。给它一个数组指针,就像在普通 C 中一样。
-
我尝试了很多不同的东西。我想不明白。我知道我不应该返回一个切片,我可能应该返回一个 unsafe.Pointer 或类似的东西。但我认为其他人会更容易理解我试图用这个例子做什么。如果您有任何示例,我将不胜感激:)