cgo-callback/main.go

48 lines
659 B
Go
Raw Normal View History

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
}