在 Go (golang) 和 C++ 之间交换数据结构(数组)
Exchange data structures (arrays) between Go (golang) and C++
我正在尝试将 C++ 库连接到用 Go 编写的应用程序服务器。目标是 C++ 库和应用程序服务器都在共同的数据结构上工作,这意味着:
- Go 应用服务器可以访问由 C++ 库创建的数组。
- C++ 库可以处理由 Go 应用程序服务器创建的数组。
我在玩 cgo 和连接 C++,到目前为止一切正常......但是,当涉及到交换数据结构指针时,我迷路了。到目前为止我尝试了什么:
//c++ library header: xyz.h
#include <stdlib.h>
class CppLib {
public:
CppLib(unsigned int input);
int * CreateArray();
};
//C++ library implementation: xyz.cpp
#include "xyz.h"
CppLib::CppLib(unsigned int input) {
_input = input;
}
int * CppLib::CreateArray() {
int values = 5;
int * myPointer = new int [values];
for (unsigned i = 0; i < values; ++i) {
myPointer[i] = i;
}
return myPointer;
}
接口实现如下:
//interface.h
int * CCreateArray();
//interface.cc
#include "../lib/xyz.h"
extern "C" {
int * CCreateArray() {
CppLib lib(1);
return lib.CreateArray();
}
}
最终的 go 实现如下所示:
package cgo_lib
// #cgo CFLAGS: -I../lib
// #cgo LDFLAGS: -L../lib -linterfacelib
// #include "interface.h"
import "C"
func GoCreateArray() *int {
return *int(C.CCreateArray())
}
编译时出现以下错误:
# cgo_lib
../cgo_lib/cgo_lib.go:13: cannot convert _Cfunc_CCreateArray() (type *C.int) to type int
../cgo_lib/cgo_lib.go:13: invalid indirect of int(_Cfunc_CCreateArray()) (type int)
所以我的问题是:如何在 C++ 和 Go 之间交换指向数据结构的指针。上面我只是描述了从C++到GO的方式,但我也对反过来感兴趣。
非常感谢您的提前帮助。
这里是:
return *int(C.CCreateArray())
可以写成
return *((int)(C.CCreateArray()))
您正在取消引用 int
,结果是:
invalid indirect of int(_Cfunc_CCreateArray()) (type int)
在该语句中,仅观察这部分:
(int)(C.CCreateArray())
您正在尝试将 *C.int
转换为 int
,这将不起作用,因为第一个是指针而第二个不是。
除此之外还有@tadman 在您的问题的评论中提到的内存管理问题,Go 并不像 C 那样将数组表示为指向其第一个元素的指针。
如果你想分享 int
s 你必须具体说明它们的宽度:Go 中的 int
具有依赖于拱形的宽度,以及 C int
.
阅读更多关于 CGO 的信息:http://golang.org/cmd/cgo/
一旦你解决了所有这些问题,你将不得不继续这样的事情:
s := make([]int32, 0, 0)
h := (*reflect.SliceHeader)((unsafe.Pointer)(&s))
h.Data, h.Len, h.Cap = P, L, L // see below
s = *(*[]int32)(h)
其中 P
是您用 C++ 创建的数组的 Go uintptr
,L
是 Go 数组的长度 int
我正在尝试将 C++ 库连接到用 Go 编写的应用程序服务器。目标是 C++ 库和应用程序服务器都在共同的数据结构上工作,这意味着:
- Go 应用服务器可以访问由 C++ 库创建的数组。
- C++ 库可以处理由 Go 应用程序服务器创建的数组。
我在玩 cgo 和连接 C++,到目前为止一切正常......但是,当涉及到交换数据结构指针时,我迷路了。到目前为止我尝试了什么:
//c++ library header: xyz.h
#include <stdlib.h>
class CppLib {
public:
CppLib(unsigned int input);
int * CreateArray();
};
//C++ library implementation: xyz.cpp
#include "xyz.h"
CppLib::CppLib(unsigned int input) {
_input = input;
}
int * CppLib::CreateArray() {
int values = 5;
int * myPointer = new int [values];
for (unsigned i = 0; i < values; ++i) {
myPointer[i] = i;
}
return myPointer;
}
接口实现如下:
//interface.h
int * CCreateArray();
//interface.cc
#include "../lib/xyz.h"
extern "C" {
int * CCreateArray() {
CppLib lib(1);
return lib.CreateArray();
}
}
最终的 go 实现如下所示:
package cgo_lib
// #cgo CFLAGS: -I../lib
// #cgo LDFLAGS: -L../lib -linterfacelib
// #include "interface.h"
import "C"
func GoCreateArray() *int {
return *int(C.CCreateArray())
}
编译时出现以下错误:
# cgo_lib
../cgo_lib/cgo_lib.go:13: cannot convert _Cfunc_CCreateArray() (type *C.int) to type int
../cgo_lib/cgo_lib.go:13: invalid indirect of int(_Cfunc_CCreateArray()) (type int)
所以我的问题是:如何在 C++ 和 Go 之间交换指向数据结构的指针。上面我只是描述了从C++到GO的方式,但我也对反过来感兴趣。
非常感谢您的提前帮助。
这里是:
return *int(C.CCreateArray())
可以写成
return *((int)(C.CCreateArray()))
您正在取消引用 int
,结果是:
invalid indirect of int(_Cfunc_CCreateArray()) (type int)
在该语句中,仅观察这部分:
(int)(C.CCreateArray())
您正在尝试将 *C.int
转换为 int
,这将不起作用,因为第一个是指针而第二个不是。
除此之外还有@tadman 在您的问题的评论中提到的内存管理问题,Go 并不像 C 那样将数组表示为指向其第一个元素的指针。
如果你想分享 int
s 你必须具体说明它们的宽度:Go 中的 int
具有依赖于拱形的宽度,以及 C int
.
阅读更多关于 CGO 的信息:http://golang.org/cmd/cgo/
一旦你解决了所有这些问题,你将不得不继续这样的事情:
s := make([]int32, 0, 0)
h := (*reflect.SliceHeader)((unsafe.Pointer)(&s))
h.Data, h.Len, h.Cap = P, L, L // see below
s = *(*[]int32)(h)
其中 P
是您用 C++ 创建的数组的 Go uintptr
,L
是 Go 数组的长度 int