CGO是什么,Go语言中的CGO工具(新手必看)
C/C++ 经过几十年的发展,已经积累了庞大的软件资产,其中有很多资产是久经考验的且性能已充分优化。Go 语言必须能够站在 C/C++ 这个“巨人”的肩膀之上,只有有了海量的 C/C++ 软件资产作为基础,我们才可以放心愉快地用 Go 语言编程。
C语言作为一种通用语言,很多库会选择提供一个 C 兼容的 API,然后用其他不同的编程语言实现。Go 语言通过自带的 CGO 工具来支持 C 语言函数调用,同时我们可以用 Go 语言导出 C 动态库接口供其他语言使用。
在 2010 年,中国的 Go 语言爱好者韦光京完善了 CGO 对 Windows 系统的支持。10 多年后,中国的 Go 语言爱好者朱德江为从 C 语言函数调用 Go 语言函数带来了近 10 倍的性能提升。可以说,CGO 与中国 Go 语言爱好者有着密切的关系。
接下来将通过一系列由浅入深的小例子来帮助读者快速掌握 CGO 的基本用法。
真实的 CGO 程序一般都比较复杂,不过我们可以由浅入深。一个最简 CGO 程序该是什么样的呢?要构造一个最简 CGO 程序,既要忽视一些复杂的 CGO 特性,还要能展示 CGO 程序和纯 Go 程序的差别。
下面是我们构建的最简 CGO 程序:
虽然没有调用 CGO 的相关函数,但是 go build 命令会在编译和连接阶段启动 gcc 编译器,这已经是一个完整的 CGO 程序了。
再来看一个 CGO 程序:
C语言作为一种通用语言,很多库会选择提供一个 C 兼容的 API,然后用其他不同的编程语言实现。Go 语言通过自带的 CGO 工具来支持 C 语言函数调用,同时我们可以用 Go 语言导出 C 动态库接口供其他语言使用。
在 2010 年,中国的 Go 语言爱好者韦光京完善了 CGO 对 Windows 系统的支持。10 多年后,中国的 Go 语言爱好者朱德江为从 C 语言函数调用 Go 语言函数带来了近 10 倍的性能提升。可以说,CGO 与中国 Go 语言爱好者有着密切的关系。
接下来将通过一系列由浅入深的小例子来帮助读者快速掌握 CGO 的基本用法。
真实的 CGO 程序一般都比较复杂,不过我们可以由浅入深。一个最简 CGO 程序该是什么样的呢?要构造一个最简 CGO 程序,既要忽视一些复杂的 CGO 特性,还要能展示 CGO 程序和纯 Go 程序的差别。
下面是我们构建的最简 CGO 程序:
package main import "C" func main() { println("hello cgo") }这段代码通过 import "C" 语句启用了 CGO 特性,主函数只是通过 Go 内置的 println() 函数输出字符串,其中没有任何与 CGO 相关的代码。
虽然没有调用 CGO 的相关函数,但是 go build 命令会在编译和连接阶段启动 gcc 编译器,这已经是一个完整的 CGO 程序了。
再来看一个 CGO 程序:
package main // #include <stdio.h> import "C" func main() { C.puts(C.CString("Hello, World\n")) }这个版本不仅通过 import "C" 语句启用了 CGO 特性,还包含了 C 语言的 stdio.h 头文件。然后通过 cgo 包的 C.CString() 函数将 Go 语言字符串转换为 C 语言字符串,最后调用 cgo 包的 C.puts() 函数向标准输出打印转换后的 C 字符串。