Hi There, (Originally posted on StackOverflow <http://stackoverflow.com/questions/42689133/invalid-memory-address-when-calling-go-from-python>, trying my luck here as well).
I'm trying to extend the code in Calling Go Functions from Other Languages. I'd like see how a function returning an error can be handled. See the code below, I get "panic: runtime error: invalid memory address or nil pointer dereference" when running the Python code. Any ideas on how to fix this? gmath.go package main import ( "fmt" ) import "C" //export Div func Div(x, y float64) (float64, error) { fmt.Printf("Div called: x=%f, y=%f\n", x, y) if y == 0 { return 0, fmt.Errorf("ZeroDivisionError") } return x / y, nil } func main() {} gmath.py import ctypes class GoInterface(ctypes.Structure): _fields_ = [ ('t', ctypes.c_void_p), ('v', ctypes.c_void_p), ] class DivRet(ctypes.Structure): _fields_ = [ ('result', ctypes.c_float), ('error', GoInterface), ] lib = ctypes.cdll.LoadLibrary('./gmath.so') lib.Div.argtypes = [ctypes.c_double, ctypes.c_double] lib.Div.restype = DivRet r = lib.Div(1.2, 2.3) Example run $ make go build -o gmath.so -buildmode=c-shared gmath.go $ python gmath.py Div called: x=1.200000, y=2.300000 panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x17 pc=0x7fbe5fda928d ] goroutine 17 [running, locked to thread]: main._cgoexpwrap_448ea9090bef_Div.func1(0xc42003cea8) command-line-arguments/_obj/_cgo_gotypes.go:46 +0x42 main._cgoexpwrap_448ea9090bef_Div(0x3ff3333333333333, 0x4002666666666666, 0x3fe0b21642c8590b, 0x0, 0x0) command-line-arguments/_obj/_cgo_gotypes.go:48 +0xaa [1] 29009 abort (core dumped) python gmath.py I've tried calling the Go code directly from C - with same results. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.