Cgo语言交互 | 青训营

201 阅读1分钟

1.调用方法

  • 用注释写C代码
  • 完成后使用import "C"向编译器传递信号
  • 调用时使用C.xxx调用

2.调用案例

下面是一个简单使用go调用C的例子。

 package main
 ​
 /*
 #include <stdio.h>
 void hello() {
     printf("Hello from C!\n");
 }
 */
 import "C"
 ​
 func main() {
     C.hello()
 }
 ​

3.类型映射

go语言与C语言之间存在着类型互相映射的转换,便于使用。

3.1 基本类型映射

go语言类型C语言类型
C.charchar
C.scharsigned char
C.ucharunsigned char
C.shortshort
C.ushortunsigned short
C.intint
C.uintunsigned int
C.longlong
C.ulongunsigned long
C.longlonglong long
C.ulonglongunsigned long long
C.floatfloat
C.doubledouble
unsafe.Pointervoid*

3.2 struct/enum/union映射

类型go语言形式C语言
结构体C.struct_xxxxxx
枚举C.enum_xxxxxx
联合体C.union_xxxxxx

3.3 字符串映射

可以使用以下函数处理go语言string到C语言字符数组的转换。(有额外的内存开销)

  • C.CString()
  • C.GoString()
  • C.GoStringN()

注意:使用C.free(unsafe.Pointer(cstr))的方式释放字符数组的内存。

 var gostr string
 gostr="xxxx"
 ​
 cstr:=C.CString(gostr)
 defer C.free(unsafe.Pointer(cstr))
 ​
 C.sprintf(cstr,"content is: %d",123)

4.函数调用注意点

4.1 错误码(第二参数返回)

go对常规C语言函数调用增加了一个err的返回值。

 n, err:= C.atoi("a234")

4.2 数组传参

go语言使用C语言传递数组类型参数,必须将第一个元素的地址作为整个数组的起始地址传入。

 n, err:= C.f(&array[0])     //代替C语言中的f(array)