C 语言与 Golang 相互调用的简单例子。
在此使用一段简单的代码展示 CGO 的基本用法 —— 在 Go 程序中使用 C 语言编程。
使用 C 源码编译
项目目录结构:
| |
在 add.h、add.c 中,分别定义已经实现了两数相加的函数 add:
| |
| |
在 add.go 中,对 C 语言实现的函数 add 进行了一次封装,以便外部调用:
| |
其中的 import "C" 表示使用了 CGO 。在这条语句前面的注释是一段 C 语言代码。
这里就定义了哪些 C 语言函数被引用。也可以在这里直接编写函数并实现。因为这个特殊的语法,import “C” 必须单独一行,不可与其他包一起引用。
可以看到在代码中引用了头文件 add.h 以及 C 标准库的头文件,另外还实现了另一个两数相乘的函数 mul。
在 Golang 中通过使用 C.xxx 的方式调用 C 函数。HelloWorld 展示了对库函数的调用。Add 和 Mul 展示了对自定义函数的调用。
因为Golang 和 C 有各自的变量类型。所以传参时候需要进行类型转换。
HelloWorld 在传参时使用 C.CString 将 Golang 字符串类型转换为 C 语言类型。
因为 C.CString 是在堆上分配空间存放字符串,需要调用者自己释放,所以最后调用 C.free 释放该字符串。
点击这里获取更多类型转换的知识。
最后在 main.go 中引用 add 包:
| |
编译运行后可以看到输出:
| |
其中 add.c 因为 import ./add 的引用而参与编译。
使用链接库
除了可以直接使用 C 源码编译 Go 程序,还可以:
- 调用 C 导出的静态库/动态库
- 把 Golang 编译成静态库/动态库供 C 其他程序调用。
参考
更多 CGO 知识可以从这里获取