我正在尝试构建一个用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端进行修改,尤其是不需要对字符串进行修改,但是出于性能原因而需要对其进行本地访问。