the Go "Callback" struct may have completely different size and alignment than the C.Foo one expected by C.initialize_engine. therefore you want to construct the C version when calling C.initialize_engine, and the Go version for everything else. Your call may look something like this:
initStruct := C.calloc(1, sizeof(C.Foo)) initStruct.key_value_cb = C.callOnMeGo_cgo initStrudct.data: C.int(1) C.initialize_engine(pattern_db, module_path, (*C.Foo)(unsafe.Pointer(initStruct))) the Go Callback struct is not required unless you expect the callbacks to change or be settable by library clients, in which case you'll need to construct a more elaborate struct that implements locking and (at least what I do) a map between callback names and interface{} pointing to the callbacks sent by the library clients. On Wed, Jul 10, 2019 at 8:14 AM Nitish Saboo <nitish.sabo...@gmail.com> wrote: > > Hi Andrey, > > I am new to Go and cgo therefore did not exactly understand your point. > Can you explain me in the context of the code that I had posted.It will > really help me to get hold of the things much better. > > Thanks, > Nitish > > On Wed, Jul 10, 2019 at 5:19 PM andrey mirtchovski <mirtchov...@gmail.com> > wrote: >> >> what i do is have a similar struct in Go, and the original C one. here >> 'callbacks' is the go one, and >> "type Engine C.struct_cl_engine" is the opaque C one: >> >> https://github.com/mirtchovski/clamav/blob/master/callback.go#L63 >> >> On Wed, Jul 10, 2019 at 5:25 AM Nitish Saboo <nitish.sabo...@gmail.com> >> wrote: >> > >> > Hi Andrey, >> > >> > I understand the issue here but how can I pass a callback function in a >> > struct to C code.I need a struct because I want to pass and an extra >> > parameter 'userdata' as well that I would require back as part of callback. >> > >> > Thanks, >> > Nitish >> > >> > On Wed, Jul 10, 2019 at 4:39 PM andrey mirtchovski <mirtchov...@gmail.com> >> > wrote: >> >> >> >> i don't think you can use a go function directly in the callback. you >> >> need a correctly-typed C helper to do it. at least that used to be the >> >> case. see examples: >> >> >> >> https://github.com/mirtchovski/clamav/blob/master/cfuncs.go >> >> https://github.com/mirtchovski/clamav/blob/master/callback.go -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CAK4xykXPuOuEo-TCXrJDPhRymX_xQC-B_Yrywz1QcvkoYYA9PQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.