Предположим, у меня есть библиотека C с кодом вроде этого:функция Pass Перейти к С, как обратный вызов
typedef int (callback_t)(int);
void register_callback(callback_t cb);
Я хочу написать идти привязок для этой функции и передавать произвольные идут обратные вызовы.
Я нашел отличный ответ 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, он не может преобразовать функцию идти к с функцией, даже если подпись та же):
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?
Вы читали https://github.com/golang/go/wiki/cgo? Там есть несколько примеров. – JimB
@JimB, не удалось найти ни одного подходящего примера, можете ли вы указать на один? – kaspersky