【发布时间】:2016-10-08 19:08:01
【问题描述】:
假设我有一个 C 库,其代码如下:
typedef int (callback_t)(int);
void register_callback(callback_t cb);
我想为此函数编写 go 绑定并传递任意 go 回调。
我找到了一个很好的答案here。然而,这是一个利用回调接受void *这一事实的技巧,Go 通过它将函数指针传递给 C 并将其接收回来。但是,这不能应用于我的示例,因为没有用户 void *。
我能做的最好的就是:
/*
extern int gobridge(int data);
static int cbridge(void)
{
register_callback(gobridge);
}
*/
import "C"
type Callback func (int) int
var g_cb Callback
//export gobridge
func gobridge(data C.int) C.int {
return C.int(g_cb(int(data)))
}
func RegisterCallback(cb Callback) {
g_cb = cb //save callback in a global
C.cbridge()
}
func Count(left, right int) {
C.count(C.int(left), C.int(right))
}
这仅适用于单个 register_callback(因为全局变量),但 C 库可以注册许多回调并调用它们。
我希望实现这样的东西,但是这不会编译(抛开clojure,即使签名相同,它也无法将go函数转换为c函数):
import "C"
func RegisterCallback(cb Callback) {
f := func (d C.int) C.int {
return C.int(cb(int(d)))
}
C.register_callback(f)
}
func Count(left, right int) {
C.count(C.int(left), C.int(right))
}
有没有办法正确绑定 C 库?
【问题讨论】:
-
你读过github.com/golang/go/wiki/cgo吗?那里有很多例子。
-
@JimB,在那里找不到一个合适的例子,你能指出一个吗?