13.4 使用cgo调用C代码

一个Go程序或许需要调用用C实现的硬件驱动程序,查询一个用C++实现的嵌入式数据库,或者使用一些以Fortran实现的线性代数协程。C作为一种编程混合语言已经很久了,所以无论那些广泛使用的包是哪种语言实现的,它们都导出了和C兼容的API。

在本节,我们将使用cgo来构建一个简单的数据压缩程序,cgo是用来为C函数创建Go绑定的工具。诸如此类的工具都叫作外部函数接口(FFI),并且cgo不是Go程序唯一的工具。SWIG(swig.org)是另一个工具;它提供了更加复杂的特性用来集成C++的类,但是这里不打算演示。

标准库的compress/...子包中提供了流行压缩算法的压缩器和解压缩器,包括LZW(UNIX工具compress使用的算法)和DEFLATE(GNU工具gzip使用的算法)。这些包中的API有些许的不同,但是它们都提供一个对io.Writer的封装用来对写入的数据进行压缩,并且还有一个对io.Reader的封装,当从中读取数据的同时进行解压缩。例如:

bzip2算法基于优雅的Burrows-Wheeler变换,它比gzip运行起来慢但是可以得到更好的压缩效果。包compress/bzip2提供了bzip2的解压缩器,但是目前该包还没有提供压缩功能。从头开始开发工作量较大,但是恰好有一个文档完善且高性能的的开源C语言实现:来自bzip.org的libbzip2包。

如果C库很小,我们可以使用纯Go语言来移植它,并且如果性能对我们来说不是很关键,我们最好使用包os/exec以辅助子进程的方式来调用C程序。仅当你需要使用拥有有限C ...

Get Go程序设计语言 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.