Go语言内嵌C语言数据类型转换
前言:go内嵌c语言,文件开通首先需要引入C的头文件,和指定的对应库,具体格式如下:
/*
#cgo CFLAGS : -I./include
#cgo LDFLAGS: -L./ -lXXX
#include <stdio.h>
#include <stdlib.h>
int num = 0;
char buf[100] = {0};
*/
import “C”
重点:此处import "C"必须与注释部分挨着,中间不允许空行。
1.数据类型转换 test.go:
go文件中c变量使用:
int:
定义c变量:int num;
则go的变量 a := int(C.num)
char:
c: char buf[100] = {0};
go: go_buf := C.GoString(&C.buf[0])
结构体:
c: typedef struct test{
int a;
char buf[100];
}TEST_S;
go:go文件中如果引用C的头文件已包含对应的结构体,那么再go中不需要再次声明,直接使用该结构体类型:
方法一:stTest := C.TEST_S{} //推荐方式一,方式二有点反人类。
方法二:stTest := C.struct_test{}
指针:
go中指针和变量类型和C中基本一致,此处姑且认为大家都是有编码基础的,如有需求欢迎讨论。
API封装形参:
提供给go的c接口对外变量类型必须是标准c库的,不能使用内部定义的,否则go编译连接库时会报错。
go变量转换c类型:
一般用在调用c接口时用:
C.CString()
C.int()
如果想要打印C的结构体,可以通过fmt使用%v输出,但是字符串依然是反人类的,建议将字符串变量转换为go的类型后输出打印。
关于切片等也是可以实现的,时间不早了,后续有时间接着写。