cgo паника при возврате указателя на структуру C, которая содержит указатель - PullRequest
0 голосов
/ 05 марта 2019

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

...