Юзкейс: К основной программе на Go линкуется сишная разделяемая библиотека, которая будет вызывать колбэк реализованный в Go. Как реализовать сабж?
main.go:
package main
/*
#cgo CFLAGS: -I.
#cgo LDFLAGS: -L. mylib.so
void mylib_init(void *log_f);
void mylib_shutdown();
*/
import "C"
import (
"log"
"time"
"unsafe"
)
func main() {
C.mylib_init((*C.void)(unsafe.Pointer(logMessage)))
{
log.Debug("Serving...")
time.Sleep(5 * time.Second)
}
C.mylib_shutdown()
}
// export logMessage
func logMessage(level C.int, message *C.char) {
switch level {
case 0:
log.Error(C.GoString(message))
break
case 1:
log.Warn(C.GoString(message))
break
case 2:
log.Info(C.GoString(message))
break
case 3:
log.Debug(C.GoString(message))
break
default:
}
}
Код не компилируется. Пробовал другие варианты, но тоже не выходит. В гугле внятного ответа не нашел.
./main.go:155: cannot use (*C.void)(unsafe.Pointer(logMessage)) (type *C.void) as type unsafe.Pointer in argument to func literal
./main.go:155: cannot convert logMessage (type func(C.int, *C.char)) to type unsafe.Pointer
Спасибо.