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