这一期我们讲一讲 Go 语言高级部分的 CGO 编程入门。
想必学 Go 语言的人都知道,Go 语言创作者之一的 Ken Thompson 曾与 Dennis Ritchie 一起共同发明了 C 语言。Go 语言又被称之为 21 世纪的 C 语言。C 语言作为一个通用语言,很多库会选择提供一个 C 兼容的 API ,然后用其他不同的编程语言实现。Go 语言通过自带的一个叫 CGO 的工具来支持 C 语言函数调用,同时我们可以用 Go 语言导出 C 动态库接口给其它语言使用。
下面是几个可能用到 CGO 的场景:
通过 OpenGL 或 OpenCL 使用显示卡的计算能力 通过 OpenCV 来进行图像分析 通过 Go 编写 Python 扩展 通过 Go 编写移动应用
第一个 CGO 程序
真实的 CGO 程序一般都比较复杂。下面是一个最简的 CGO 程序例子:
package main
import "C"
func main() {
println("Hello CGO")
}
import "C"printlnHello CGOgo build
Hello CGO
基于 C 标准库函数的输出
C.CString()C.puts()import "C"//#include
package main
//#include<stdio.h>
import "C"
func main() {
C.puts(C.CString("Hello CGO\n"))
}
运行该程序同样会输出字符串:
Hello CGO
C.CString()
调用自定义 C 函数
import "C"
package main
/*
#include<stdio.h>
static void MyPrint(const char* s) {
puts(s);
}
*/
import "C"
func main() {
C.MyPrint(C.CString("Hello CGO\n"))
}
运行该程序同样会输出字符串:
Hello CGO
MyPrint().cstatic
// main.c
#include <stdio.h>
void MyPrint(const char* s) {
puts(s);
}
// main.go
package main
//void MyPrint(const char* s);
import "C"
func main() {
C.MyPrint(C.CString("Hello CGO\n"))
}
go run .
Hello CGO
因为时间关系这一期我们先讲这么多,下一期再补充另外一些 CGO 编程入门基础。
参考文献:
[1] 柴树杉;曹春晖, Go 语言高级编程, 北京: 人民邮电出版社, 2019.