Я пытаюсь собрать небольшую библиотеку, написанную на 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, особенно не в строках, но должны быть доступны непосредственно для соображений производительности.