接受如何通过golang调用c/c++的(部分c++接口还是无法使用的)
- golang调用c/c++主要通过cgo, cgo原本只是为c设计的, 调用c代码,无需预编译,可以直接调用
- 如果是调用c++, 需要编译成libxx.a的编译包,然后进行调用
- 基础用法,在golang中直接调用c代码
- 将c代码写到h文件中,在go文件中调用
- c代码包含.c与.h文件,.h文件只包含声明,.c文件是实现;此方式需要引入hello.c文件
- c代码包含.c与.h文件,.h文件只包含声明,.c文件是实现;这里我们开始通过libxx.a的方式进行引入
- c代码包含.cpp与.h文件,.h文件只包含声明,.cpp文件是实现;这里只能通过libxx.a的方式进行引入
- golang与c进行集合类型的交互
- c代码与golang不在同一级代码,使用libxx.a的方式引用
- golang与c进行struct类型的交互
- golang调用c/c++的时候,c/c++有依赖lib(如果在c/c++中可以直接使用#pragma comment ( lib, "D3D11.lib"))
- golang中通过使用dll中的方法
- golang与c进行callback交互, 通过//export进行对应,可以同时多个export
- c调用golang的函数,与callback完全是一回事
C |
CGO |
golang |
char |
C.char |
byte |
signed char |
C.schar |
int8 |
unsigned char |
C.uchar |
uint8 |
short int |
C.short |
int16 |
short unsigned int |
C.ushort |
uint16 |
int |
C.int |
int |
unsigned int |
C.uint |
uint32 |
long int |
C.long |
int32 or int64 |
long unsigned int |
C.ulong |
uint32 or uint64 |
long long int |
C.longlong |
int64 |
long long unsigned int |
C.ulonglong |
uint64 |
float |
C.float |
float32 |
double |
C.double |
float64 |
wchar_t |
C.wchar_t |
|
char* |
|
string |
bool |
C.bool |
bool |
void * |
|
unsafe.Pointer |
- 注*: string(golang) --> char*(c) C.CString("张三")
- char*(c) --> string(golang) C.GoString(C.getString()) 详情看代码baseMain.go
C语言类型 |
CGO类型 |
Go语言类型 |
int8_t |
C.int8_t |
int8 |
uint8_t |
C.uint8_t |
uint8 |
int16_t |
C.int16_t |
int16 |
uint16_t |
C.uint16_t |
uint16 |
int32_t |
C.int32_t |
int32 |
uint32_t |
C.uint32_t |
uint32 |
int64_t |
C.int64_t |
int64 |
uint64_t |
C.uint64_t |
uint64 |
- git init
- git remote add origin https://github.com/zj360202/TestCpp.git
- git pull origin master
- git add src/main.js
- git commit -m "first commit"
- git push -u origin master