<stdint.h> 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()