当返回指向包含指针的C结构的指针时,cgo出现恐慌

时间:2019-03-05 15:21:53

标签: go struct lua cgo panic

我正在尝试构建一个用Go语言编写的小型库,用于luajit。我可以正确地得到想要的东西,直到返回指针的结构包含指针本身为止。

获取源代码:

package main
//typedef struct {
//  int     myint;
//  double  mydouble;
//  char*   mystring;
//} mystruct;
import "C"
import "fmt"
var myvar  C.mystruct
//export Init
func Init() {
    myvar.myint     = 1
    myvar.mydouble  = 2.0
    myvar.mystring  = C.CString("three")
    fmt.Println("myvar in go  : ", myvar.myint, myvar.mydouble, myvar.mystring)
}
//export GetVar
func GetVar() *C.mystruct {
    return &myvar
}
func main () {}

Lua来源:

#! /usr/bin/luajit
local ffi   = require("ffi")
local go    = ffi.load("./golua.lib")
ffi.cdef[[
typedef struct {
    int     myint;
    double  mydouble;
    char*   mystring;
} mystruct;
extern void Init();
extern mystruct* GetVar();
]]
go.Init()
local var = go.GetVar()
print("myvar in lua : ", var.myint, var.mydouble, ffi.string(var.mystring))

在运行时得到这个:

lionel@pc-lionel:~/go/src/tests/lua$ go build -buildmode=c-shared -o golua.lib *.go
lionel@pc-lionel:~/go/src/tests/lua$ ./gotest.lua 
myvar in go  :  1 2 0x55c17f41c360
panic: runtime error: cgo result has Go pointer

goroutine 17 [running, locked to thread]:
main._cgoexpwrap_86693eaa8e33_GetVar.func1(0xc420056ea8)
    _cgo_gotypes.go:95 +0x3c
main._cgoexpwrap_86693eaa8e33_GetVar(0x7ff15cccac60)
    _cgo_gotypes.go:97 +0x5b
Abandon (core dumped)

请注意,指针的类型无关紧要,可以是int *或其他任何形式,它会以相同的方式恐慌。我也尝试过GetVar返回unsafe.Pointer而不是完全相同的结果。在上面的示例中,我什至不需要将C.CString分配给mystring,反正cgo恐慌。

出于我的项目目的,这些C结构不需要在lua端进行修改,尤其是不需要对字符串进行修改,但是出于性能原因而需要对其进行本地访问。

0 个答案:

没有答案