Один из способов настроить функцию обратного вызова для передачи в параметр функции DLL — использовать CGO...
package main
/*
#cgo LDFLAGS: -L${SRCDIR} -lsomelib
#include "somelib.h"
extern void CallbackString(char* s);
*/
import "C"
import (
"unsafe"
"fmt"
)
//export CallbackString
func CallbackString(s *C.char) {
gostr := C.GoString(s) // convert to golang string
fmt.Println("Got string from dll (or dso): ", gostr)
}
func Example() {
// setup a callback by calling a function in
// the DLL requiring callback param
C.SomeDLLFunc(x,y,
(C.TCallbackString)(unsafe.Pointer(C.CallbackString)),
other,
params)
}
func main() {
Example()
}
где обратный вызов определяется как
typedef void (*TCallbackString)(char*);
Но мне интересно, есть ли способ избежать использования CGO и просто передать функцию go в качестве параметра, не требуя ненужных привязок кода C... т.е.
C.SomeDLLFunc(x,y,
CallbackString, // how to send the go function in as a callback?
other,
params)
Всегда ли требуется писать привязки C или как бы вы их ни называли, C-ссылки на код go, C-экспорты/экстерны, чтобы отправить обратный вызов в качестве параметра?
Нет способа просто сделать функцию go обратным вызовом, не сделав ее сначала C-ish?
C.SomeDLLFunc(x,y,
WhatCastIsNeeded(CallbackString), // regular go function as a callback?
other,
params)