至少目前来说此路不通……
对于 C 的了解仅限于 Hello World ,链接、符号什么的一无所知,所以其实一开始就是抗拒 CGO 的,打算的就是使用 UDS 来实现外部的数据库驱动。但是数据库驱动的 Rows 和 Tx 都是不可恢复对象,如果进程挂了,即使重启之后状态也都对应不上,此时只能强行关闭相关的 UI 。——这体验也太糟糕了。
所以开始调研使用 CGO 来加载由 Go 编译的动态库。在 github 的 issues 里有一些关于这方面的讨论,都是说不可行。但是看到了 purego ,尝试之后发现真的可以工作! windows 和 linux 上都没有问题。实现方式是,仅暴露了 4 个函数,DllVersion
, DllOpenObj
, DllCall
和DllCancel
,传递的参数都是 uintptr,且没有返回值。返回值的内存由主程序生成,当作参数传递,然后 Dll 里面使用 JSON 序列化后写入。——至少在 windows/linux 上这么做是可以的。虽然需要序列化,但是还是要比通过 UDS 来做要好。
我没有 Mac 的设备,但是我觉得 linux 都没有问题,那应该也没事。
我做好了 Dll 的加载和简单的管理,在准备发布前的测试时,我使用 quckemu 成功的运行了 MacOs 的虚拟机。却发现在 Mac 上不论是 purego 还是 plgin 都不能成功的运行由 Go 编译的动态库。purego 可能是 dll 内部的 Go Runtime 没有初始化,plugin 可能是数据库的驱动是依赖 CGO 的缘故。
总之,我很失望,至少目前来说此路不通……
UDS 又有状态不能同步的问题,所以只能取消外部数据库驱动这个功能,全部都打包到一起了……😓