golang的cgo的一点小心得

最后有个项目需要涉及到cgo,在这块以前用的不多,

这次略微用得深入了一点,记下来几点以备以后使用

复制代码
本质上cgo去用的时候就是遵守一些ABI而已,总体而言,尽量避免复杂结构的来回传递。

1  对于变长参数,只有写一个个c的方法,比如static方法wrap一下成非变长的,当然这样罗嗦但是没办法
2 对于enum,可直接使用,c语言的void*对应着unsafe.Pointer

3 比较复杂的是对于需要传一个函数指针/回调函数的,只有走曲线救国的路线,即
 传一个c写的wrap->调用go export的的方法(其实就是通过//export导出加_cgo_export.h即可让c使
用),排查问题的时候可通过-work保留中间生成的.h文件。当然在这之上略微进阶一点是玩个trampoline,其实注是加了个中间层,这样可以支持go的闭包。 

4 库的加载自己采用pkg-config(macos/linux上都可以,windows不可以),即macos上开发,docker(linux)跑。

后话:

为了玩这个,我找了个开源的好好读了一下,同时为了更深入一点,把别人的c代码也读了一下,同时为了更好玩,我选择了Rust(这个也是我喜欢玩的语言之一,但是要看场景 ),Rust的FFI的话那确实是更适合做这种绑定,更别说Rust更鼓励做static而不是share的库,可能背后也跟golang有自己的运行时,和c其实映射上也做不到rust那样简单,或许这就是rust零抽象的一个具体体现吧.

相关推荐
零依赖极客15 分钟前
Day 6·1 ARMv8.2 dotprod——vdotq_s32 一条指令做 4 个点积
c语言·开发语言·人工智能·矩阵·arm·vllm
陈随易1 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
新时代牛马2 小时前
cyclictest 毛刺从哪来?从ftrace、latencytop、perf到IRQ/调度延迟定位
android·开发语言·python·kotlin
三8442 小时前
Java 模板注入(FreeMarker) · 02 · 模板引擎与 FreeMarker 语法
java·开发语言·web安全·freemarker
IvanCodes2 小时前
Python 基础语法(七):推导式与常见遍历写法
开发语言·python
暮雨哀尘2 小时前
Java 基础练习(一):创建类并调用对象
java·开发语言
wing983 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
EatFan3 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
zhangzeyuaaa3 小时前
Python requests:raise_for_status() 与 4xx/5xx 异常层次详解
开发语言·python
泡海椒3 小时前
动态代理核心原理:JQuick-Java接口规则自动生成机制解析
java·开发语言·python