1、编写你的XXX.cpp文件,实现你的业务功能;
供go调用的函数是 void CalcTeam(double arr1[], int arr1len, double arr2[], double *ret, int retlen)
注意使用
extern "C" {
你要暴露出去的函数,就是上面的CalcTeam
void CalcTeam(double arr1[], int arr1len, double arr2[], double *ret, int retlen)
{
}
}
2、编写aaaaaaaa.h声明文件;
#ifndef __AAAAAAAAA_H__
#define __AAAAAAAAA_H__
void CalcTeam(double arr1[], int arr1len, double arr2[], double *ret, int retlen);
#endif
3、生成so文件
g++ XXX.cpp -fPIC -shared -o libxxx.so
4、添加go程序的main函数头(我将所有c相关的代码都放在了cpp目录下)
/*
#include "cpp/aaaaaaaa.h"
#cgo LDFLAGS: -ldl -L ./cpp -lxxx
*/
import "C"
上面这个头声明很重要,第一行是引入.h文件,注意目录即可
第二行是让go的程序能够找到.so文件,所以需要指定目录,同时指定文件名称
5、编写go程序main函数
arr1 := make([]C.double, 7)
arr2 := make([]C.double, 7)
arr1 = []C.double{0.8, 0.9, 0.25, 0.6, 0.37, 0.87, 0.98}
arr2 = []C.double{0.7, 0.2, 0.45, 0.5, 0.67, 0.23, 0.6}
ret := make([]C.double, 3)
C.CalcTeam((*C.double)(unsafe.Pointer(&arr1[0])), C.int(len(arr1)),
(*C.double)(unsafe.Pointer(&arr2[0])), (*C.double)(unsafe.Pointer(&ret[0])), 3)
这里重点说一下,如何传递数组参数给c++。
因为c++中接收参数是一个double类型的数组,而go中没有double类型,
【go传递数组给C++,double类型】
arr1 := make([]C.double, 7)
arr1 = []C.double{0.8, 0.9, 0.25, 0.6, 0.37, 0.87, 0.98}
(*C.double)(unsafe.Pointer(&arr1[0]))
【go传递整数给C++,int类型】
C.int(len(arr1))