在 Go 语言中,CGO 容许 Go 程序间接调用 C 语言代码。这是通过链接 Go 和 C 语言的二进制代码来实现的。这样,Go 程序能够应用 C 语言的库,或者在性能要害的中央应用 C 语言代码。
CGO 的引入
要在 Go 程序中应用 CGO,你须要导入 “C” 包:
import "C"
这个 “C” 包是一个非凡的包,它不真正存在于 Go 的规范库中。当编译器看到这个导入语句时,它会启动 CGO。
C 语言代码的嵌入
在导入 ”C” 之后,你能够在正文中嵌入 C 语言代码。这个 C 语言代码会在编译时被编译器提取进去,而后与 Go 代码一起链接。
例如,你能够这样嵌入一个 C 语言函数:
/*
#include <stdio.h>
void myprint(char* s) {printf("%s\n", s);
}
*/
import "C"
这段代码会嵌入一个 C 语言的 myprint
函数,这个函数承受一个字符串参数,而后打印它。
C 语言函数的调用
嵌入的 C 语言函数能够像一般的 Go 函数一样调用。例如,你能够这样调用 myprint
函数:
func main() {C.myprint(C.CString("Hello, CGO"))
}
留神,咱们必须应用 C.CString
函数将 Go 字符串转换为 C 字符串,因为 C 字符串和 Go 字符串在内存中的示意是不同的。
C 语言库的链接
CGO 还容许链接 C 语言的库。例如,你能够链接规范的 C 库 libc
:
/*
#cgo LDFLAGS: -lc
#include <stdio.h>
*/
import "C"
#cgo LDFLAGS: -lc
指令通知编译器链接 libc
库。而后,你就能够调用 libc
库中的函数了。
总的来说,CGO 是一个弱小的工具,它让 Go 程序能够间接调用 C 语言代码。然而,你须要留神 CGO 的应用会减少编译工夫,同时也会使得程序的移植性变差。因而,除非必要,否则应尽量避免应用 CGO。
举荐浏览:
https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA
https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g