Miki, I believe that's a side-effect of the cgocheck pointer rules.
if you add another testcase just before the call to lib.Div(1.2,2.3) such as: r = lib.Div(1,0) you'll see: Div called: x=1.000000, y=0.000000 panic: runtime error: cgo result has Go pointer goroutine 17 [running, locked to thread]: main._cgoexpwrap_129de112d50d_Div.func1(0xc420038ea8) command-line-arguments/_obj/_cgo_gotypes.go:46 +0x42 main._cgoexpwrap_129de112d50d_Div(0x3ff0000000000000, 0x0, 0x0, 0x7faa00edd020, 0xc420012290) command-line-arguments/_obj/_cgo_gotypes.go:48 +0xaa Aborted (core dumped) ie: when the error is not nil, the panic is different. if you run like so: $> GODEBUG=cgocheck=0 python ./gmath.py Div called: x=1.000000, y=0.000000 Div called: x=1.200000, y=2.300000 FYI, if you were to use github.com/go-python/gopy, you could do: $> cat > pkg.go package gmath import "fmt" func Div(x,y float64) (float64, error) { ... } $> gopy bind . $> GODEBUG=cgocheck=0 python2 py2> import gmath py2> gmath.Div(1,0) Div called: x=1.000000, y=0.000000 Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: ZeroDivisionError py2> gmath.Div(1.2,2.3) Div called: x=1.200000, y=2.300000 0.5217391304347826 </shameless-plug> hth, -s On Thu, Mar 9, 2017 at 4:00 PM, Miki Tebeka <miki.teb...@gmail.com> wrote: > 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. > -- 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.