2017-03-09 131 views
0

我試圖擴展代碼Calling Go Functions from Other Languages。我想看看如何處理返回錯誤的函數。請參閱下面的代碼,運行Python代碼時獲得panic: runtime error: invalid memory address or nil pointer dereference。有想法該怎麼解決這個嗎?「無效內存地址」調用時從Python跳轉

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) 

實施例運行

$ 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 

回答

1

似乎的錯誤部分結果是最初的問題。如果我將錯誤更改爲一個字符串並返回(float64,* C.char),它將起作用。

+0

另請參閱https://groups.google.com/forum/#!topic/golang-nuts/xOqrJjS7-xE – lazy1