CGO
混合编程,在 Go 和 C 代码间相互调用:
- CGO 不是 Go
- 直接在 Go 源文件内嵌入 C 代码
- 直接编译(链接)C 源码文件
- 导入动态库(.so)
混合编程很常见,现在很多项目使用不同语言也是一种混合编程,只不过很少基于编译器混合编程。
编译分成编译和链接部分。编译前端生成 .obj 文件,链接器生成可执行文件。换句话说,无论前端是什么语言,使用不同的前端翻译成同样格式的 obj 文件,接下来后端完成汇编的优化和链接。
混合编程关键在于编译器能支持多少种语言的编译,现在编译器支持很多前端,后端必须保证 ABI 的兼容。ABI 包含调用函数参数怎么入栈、入栈是什么顺序、调用方分配内存还是函数分配内存、返回值怎么处理,甚至使用什么寄存器诸如此类的规则。这些规则基于二进制保持一种相同的调用格式,无论什么语言生成的汇编都是一致的都可以实现调用。所以 ABI 保证二进制层面上的稳定性,另外操作系统的系统调用也属于 ABI 的内容。
Go 语言对前端的支持除了默认 Go 以外,还通过 CGO 支持 C 语言,Go 语言通过 CGO 把 C 语言处理成相同的汇编 ABI 格式,最后去调用,这会有一些转换的过程。
Go 最早的定位是 Next C,必然要继承 C 的遗产。除了语法设计