Go desde Lua

Entradas Archivos Wallpaper Problemas

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