asp.net手机网站开发,烟台html5网站建设,北京展厅设计制作,百度浏览器极速版cgo直接调用函数#xff0c;使用基本数据类型非常简单#xff0c;包括一些结构体也比较简单#xff0c;嵌套的稍微复杂些#xff0c;但也可以#xff0c;但有的时候#xff0c;cgo调用c函数#xff0c;会需要传递一个回调函数的指针#xff0c;这时候就比较复杂了…cgo直接调用函数使用基本数据类型非常简单包括一些结构体也比较简单嵌套的稍微复杂些但也可以但有的时候cgo调用c函数会需要传递一个回调函数的指针这时候就比较复杂了要比python的ctypes复杂很多python可以用winfunc很轻松去创建这样的函数但是对于 go 这种编译型语言来说就很麻烦了实际上是如下操作
先看官方代码 这块是头文件的声明
一、构造包装函数callOnMeGo_cgo这里通过cgo编写一个自己的c函数满足要调用库的callback格式就可以。 这里int callOnMeGo(int);的函数声明可以放到函数体外面去便于查看。
如果只需要结构体某些字段可以直接在这里提取后转发过去省略了Go语言中操作的步骤。
二、用包装函数调用真正的go函数(callOnMeGo)然后就可以实现回调了
这里主入口记得声明下包装函数的结构 问题解决
1.传参后回调函数调用没效果
一般这种都是回调函数的参数类型不对比如说void *传unsafe.pointer是可以的但是结构体指针不能传unsafe.pointer可直接声明C.STRUCTXXX是指针就传* C.STRUCTXXXX
注意回调参数有问题 请看下引用的C或者C SDK 自己的日志go程序是不会有任何反应的。
2.编译报错
编译报错需要检查
①.是否注释内部有嵌套有的需要删掉或者拿出去
②.头文件的struct是否带 tag 不带tag 需要增加
③. 是否出现了释放不该释放的内容比如说回调传过来的结构体通过var声明后就进入到了Go的GC范围内不要去C.free
④.是否有C的东西如果有C的东西需要转换成C语言
⑤.编译的平台需要一致编译时需要编译整个package64位的lib需要 64 位的cgo编译
⑥.编译后导入表会对指定函数有强依赖必须带入依赖库运行时不像syscall可以懒加载。
⑦.CFLAGS、LDFLAGS的参数是否完整比如说没有使用-l指定对应的lib