随笔分类 - CGO
摘要:Web 开发简介 因为Go的net/http包提供了基础的路由函数组合与丰富的功能函数。所以在社区里流行一种用Go编写API不需要框架的观点,在我们看来,如果你的项目的路由在个位数、URI固定且不通过URI来传递参数,那么确实使用官方库也就足够。但在复杂场景下,官方的http库还是有些力有不逮。例如
阅读全文
摘要:CGO 编译和链接参数 编译和链接参数是每一个C/C程序员需要经常面对的问题。构建每一个C/C应用均需要经过编译和链接两个步骤,CGO也是如此。 本节我们将简要讨论CGO中经常用到的编译和链接参数的用法。 编译参数:CFLAGS/CPPFLAGS/CXXFLAGS 编译参数主要是头文件的检索路径,预
阅读全文
摘要:CGO静态库和动态库 CGO在使用C/C资源的时候一般有三种形式:直接使用源码;链接静态库;链接动态库。直接使用源码就是在import "C"之前的注释部分包含C代码,或者在当前包中包含C/C源文件。链接静态库和动态库的方式比较类似,都是通过在LDFLAGS选项指定要链接的库方式链接。本节我们主要关
阅读全文
摘要:C++ 类包装 CGO是C语言和Go语言之间的桥梁,原则上无法直接支持C的类。CGO不支持C语法的根本原因是C至今为止还没有一个二进制接口规范(ABI)。一个C类的构造函数在编译为目标文件时如何生成链接符号名称、方法在不同平台甚至是C的不同版本之间都是不一样的。但是C是兼容C语言,所以我们可以通过增
阅读全文
摘要:CGO内存模型 CGO是架接Go语言和C语言的桥梁,它使二者在二进制接口层面实现了互通,但是我们要注意因两种语言的内存模型的差异而可能引起的问题。如果在CGO处理的跨语言函数调用时涉及到了指针的传递,则可能会出现Go语言和C语言共享某一段内存的场景。我们知道C语言的内存在分配之后就是稳定的,但是Go
阅读全文
摘要:qsort快速排序函数是C语言的高阶函数,支持用于自定义排序比较函数,可以对任意类型的数组进行排序。本节我们尝试基于C语言的qsort函数封装一个Go语言版本的qsort函数。 认识qsort函数 qsort快速排序函数有<stdlib.h>标准库提供,函数的声明如下: void qsort( vo
阅读全文
摘要:CGO内部机制 CGO生成的中间文件 要了解CGO技术的底层秘密首先需要了解CGO生成了哪些中间文件。我们可以在构建一个cgo包时增加一个-work输出中间生成文件所在的目录并且在构建完成时保留中间文件。如果是比较简单的cgo代码我们也可以直接通过手工调用go tool cgo命令来查看生成的中间文
阅读全文
摘要:CGO函数调用 函数是C语言编程的核心,通过CGO技术我们不仅仅可以在Go语言中调用C语言函数,也可以将Go语言函数导出为C语言函数。 Go调用C函数 对于一个启用CGO特性的程序,CGO会构造一个虚拟的C包。通过这个虚拟的C包可以调用C语言函数。 package main /* static in
阅读全文
摘要:#类型转换 最初CGO是为了达到方便从Go语言函数调用C语言函数(用C语言实现Go语言声明的函数)以复用C语言资源这一目的而出现的(因为C语言还会涉及回调函数,自然也会涉及到从C语言函数调用Go语言函数(用Go语言实现C语言声明的函数))。现在,它已经演变为C语言和Go语言双向通讯的桥梁。要想利用好
阅读全文
摘要:#CGO基础 要使用CGO特性,需要安装C/C++构建工具链,在macOS和Linux下是要安装GCC,在windows下是需要安装MinGW工具。同时需要保证环境变量CGO_ENABLED被设置为1,这表示CGO是被启用的状态。在本地构建时CGO_ENABLED默认是启用的,当交叉构建时CGO默认
阅读全文
摘要:最简CGO程序 // hello.go package main import "C" func main() { println("hello cgo") } 代码通过import "C"语句启用CGO特性,主函数只是通过Go内置的println函数输出字符串,其中并没有任何和CGO相关的代码。虽
阅读全文