0
Calling Go Functions from Other Languagesにコードを拡張しようとしています。私はエラーを返す関数をどのように扱うことができるかを見たいと思います。以下のコードを参照してください。私はpanic: runtime error: invalid memory address or nil pointer dereference
をPythonコードを実行するときに取得します。どのようにこれを修正するための任意のアイデア?PythonからGoを呼び出すときに「無効なメモリアドレス」
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
https://groups.google.com/forum/#!topic/golang-nuts/xOqrJjS7-xEも参照してください – lazy1