Go desde Lua
Llamando código de Go desde Lua
Primero hay que tener un código/funciones de go como las siguiente:
func add(x int, y int) int{
return x+y
}
luego hay que importar la librería necesaria para convertirlo a código de C y también indicar que dicha función va a ser exportada
import "C"
//export Add
func add(x int, y int) int{
return x+y
}
También hay que agregar el paquete y una función main vacía, además de indicar que la función es publica convirtiendo la primera letra a mayúscula
package main
import "C"
//export Add
func add(x int, y int) int{
return x+y
}
func main() {}
Compilamos el archivo con el siguiente comando
go build -o awesome.so -buildmode=c-shared awesome.go
Esto nos generará un archivo llamado awesome.so Luego en Lua se hace lo siguiente:
local ffi = require("ffi")
local awesome = ffi.load("./awesome.so")
Y finalmente hay que añadir las definiciones, el siguiente ejemplo crea una definición en un .h para indicar su equivalencia en C
local ffi = require("ffi")
local awesome = ffi.load("./awesome.so")
ffi.cdef([[
typedef long long GoInt64;
typedef unsigned long long GoUint64;
typedef GoInt64 GoInt;
typedef GoUint64 GoUint;
typedef double GoFloat64;
typedef struct { const char *p; GoInt n; } GoString;
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
extern GoInt Add(GoInt p0, GoInt p1);
extern GoFloat64 Cosine(GoFloat64 p0);
extern void Sort(GoSlice p0);
extern GoInt Log(GoString p0);
]]);
En nuestro caso quedaría como:
local ffi = require("ffi")
local awesome = ffi.load("./awesome.so")
ffi.cdef([[
typedef long long GoInt64;
typedef GoInt64 GoInt;
extern GoInt Add(GoInt p0, GoInt p1);
]]);
Y se podría ejecutar lo siguiente sin ningún problema:
awesome.Add(1,+1) --2