Slide 14
Slide 14 text
コールバック (トランポリン ) ( 2 / 2 )
/*
#include
extern int goOpCallback(int a, int b, uintptr_t h);
static int calc(int a, int b, uintptr_t handle) {
return goOpCallback(a, b, handle);
}
*/
import "C"
//export goOpCallback
func goOpCallback(a C.int, b C.int, h C.uintptr_t) C.int {
opFn := cgo.Handle(h).Value().(func(int, int) int)
return C.int(opFn(int(a), int(b)))
}
func Calc(a, b int, opFn func(int, int) int) int {
h := cgo.NewHandle(opFn)
defer h.Delete()
return int(C.calc(C.int(a), C.int(b), C.uintptr_t(h)))
}
Calc(1, 2, func(a, b int) int { return a + b }) // 3
Go: Calc
C: calc
Go: goOpCallback
h := NewHandle(opFn)
C.calc(a, b, h)
goOpCallback(a, b, handle)
Handle(h).Value()
opFn(a, b)
h.Delete()