//export HandleFunc func HandleFunc(cpattern *C.char, cfn *C.FuncPtr) { pattern := C.GoString(cpattern) http.HandleFunc(pattern, func(w http.ResponseWriter, req *http.Request) { creq := C.Request{ Method: C.CString(req.Method), Host: C.CString(req.Host), URL: C.CString(req.URL.String()), } C.Call_HandleFunc(unsafe.Pointer(&responseWriter{w}), &creq, cfn) }) }
//export HandleFunc func HandleFunc(cpattern *C.char, cfn *C.FuncPtr) { // C-friendly wrapping for our http.HandleFunc call. pattern := C.GoString(cpattern) http.HandleFunc(pattern, func(w http.ResponseWriter, req *http.Request) { // Wrap relevant request fields in a C-friendly datastructure. creq := C.Request{ Method: C.CString(req.Method), Host: C.CString(req.Host), URL: C.CString(req.URL.String()), } // Convert the ResponseWriter interface instance to an opaque C integer // that we can safely pass along. wPtr := cpointers.Ref(unsafe.Pointer(&w)) // Call our C function pointer using our C shim. C.Call_HandleFunc(C.ResponseWriterPtr(wPtr), &creq, cfn) // Release the ResponseWriter from the registry since we're done with // this response. cpointers.Free(wPtr) }) }