46 lines
667 B
Go
46 lines
667 B
Go
|
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
|
||
|
var 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()
|
||
|
}
|
||
|
|
||
|
var myPrinter Printer = Printer(func(n int) {
|
||
|
for i := 0; i < n; i++ {
|
||
|
fmt.Printf("%d\n", i)
|
||
|
}
|
||
|
})
|
||
|
|
||
|
func main() {
|
||
|
usePrinter(myPrinter)
|
||
|
}
|