CGO使用指南
Go 提供一个名为C的伪包(pseudo-package)用来与 C/C++ 语言进行交互操作,这种Go语言与C语言交互的机制叫做 CGO。通过 CGO 我们可以在 Go 语言中调用 C/C++ 代码,也可以在 C/C++ 代码中调用Go语言。CGO 本质就是 Go 实现的 FFI(全称为Foreign function interface,用来描述一种编程语言编写的程序可以调用另一种编程语言编写的服务的机制)解决方案。
当 Go 代码中加入import C语句来导入C这个不存在的包时候,会启动 CGO 特性。此后在 Go 代码中我们可以使用C.前缀来引用C语言中的变量、类型,函数等。启动 CGO 特性时候,需要确保环境变量 CGO_ENABLED 值是1,我们可以通过go env CGO_ENABLED查看该环境变量的值,通过go env -w CGO_ENABLED=1用来设置该环境变量值。
序言
我们可以给import C语句添加注释,在注释中可以引入C的头文件,以及定义和声明函数和变量,此后我们可以在 Go 代码中引用这些函数和变量。这种注释称为 序言(preamble) 。需要注意的是 序言和import C语句之间不能有换行,序言中的静态变量是不能被Go代码引用的,而静态函数是可以的。
package main
/*
#include <stdio.h>
#include <stdlib.h>
static void myprint(char* s) {
printf("%s\n", s);
}
*/
import "C"
import "unsafe"
func main() {
cs := C.CString("hello world")
C.myprint(cs)
C.free(unsafe.Pointer(cs))
}



