package main import ( "fmt" "sync" "unsafe" ) /* #cgo CFLAGS: -I . #cgo LDFLAGS: -L . #include "mylib.h" void callOnMeGo_cgo(int n); */ import "C" //export callOnMeGo func callOnMeGo(n int) { printerCallback(n) } type Printer func(int) var ( printerCallback Printer printerCallbackLock sync.RWMutex ) func usePrinter(p Printer) { printerCallbackLock.Lock() printerCallback = p C.use_printer((C.printer_t)(unsafe.Pointer(C.callOnMeGo_cgo))) printerCallback = nil printerCallbackLock.Unlock() } func main() { var myPrinter Printer = Printer(func(n int) { for i := 0; i < n; i++ { fmt.Printf("%d\n", i) } }) usePrinter(myPrinter) }