Skip to Main Content
Go程序设计语言
book

Go程序设计语言

by 艾伦A. A.多诺万, 布莱恩W. 柯尼汉
August 2021
Beginner to intermediate content levelBeginner to intermediate
450 pages
6h 1m
Chinese
Pearson
Content preview from Go程序设计语言

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 ...

Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Start your free trial

You might also like

C++语言导学(原书第2版)

C++语言导学(原书第2版)

本贾尼 斯特劳斯特鲁普
Go语言编程

Go语言编程

威廉·肯尼迪

Publisher Resources

ISBN: 9787111558422