1
片道DLL関数のパラメータに渡されるコールバック関数は、CGOを使用することです...コールバックがCgoを最小限に抑えてDLLにGoコールバックを使用するにはどうすればよいですか?セットアップに
typedef void (*TCallbackString)(char*);
として定義されて
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()
}
しかし、私はCGO使用を避け、ちょうど
C.SomeDLLFunc(x,y,
CallbackString, // how to send the go function in as a callback?
other,
params)
は常にそれをしないすなわち..無用Cコードのバインディングを必要とせずにパラメータとしてで行く機能を渡す方法があるかどうか不思議Cのバインディングを書く必要があります。コールバックをパラメータとして送信するには、Cのリンクをgoコード、Cのエクスポート/エクスターナルにリンクする必要がありますか?
最初にC-ishにすることなく、go機能をコールバック機能にする方法はありませんか?
C.SomeDLLFunc(x,y,
WhatCastIsNeeded(CallbackString), // regular go function as a callback?
other,
params)