首页 > 其他分享 >【Go-Lua】Golang嵌入Lua代码——gopher-lua

【Go-Lua】Golang嵌入Lua代码——gopher-lua

时间:2024-02-20 19:22:58浏览次数:23  
标签:调用 err lua gopher Lua Go main


嵌入式
8 篇文章0 订阅
订阅专栏
Lua代码嵌入Golang
Go版本:1.19
首先是Go语言直接调用Lua程序,并打印,把环境跑通

package main

import lua "github.com/yuin/gopher-lua"

func main() {
L := lua.NewState()
defer L.Close()
// go
err := L.DoString(`print("go go go!")`)
if err != nil {
return
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
Lua的stdout可以直接转到go的stdout里,不过只调用打印一下没用意义,最重要的是函数调用

Go调用Lua的函数
Go调用Lua的函数最常用,Lua程序里定义函数和数据的处理方式,Go通过HTTP或者TCP获取到数据后,调用Lua的函数对数据处理,处理后,结果返回到Go语言,写入数据库或进行其他处理。

Lua代码

function add(a,b)
return a+b
end
1
2
3
Lua支持多个参数和多个返回值,参数好办,用lua.LNumber(123)

类型有:

LTNil
LTBool
LTNumber
LTString
LTFunction
LTUserData
LTThread
LTTable
LTChannel
返回值个数也可以是多个,调用CallByParam的时候,NRet就是返回参数个数,Fn是要调用的全局函数名,Protect为true时,如果没找到函数或者出错不会panic,只会返回err。

调用完成后,要以压栈的方式,一个一个取回返回值ret := L.Get(-1)

Go代码

package main

import (
"fmt"

lua "github.com/yuin/gopher-lua"
)

func main() {
L := lua.NewState()
defer L.Close()
// go
err := L.DoFile("main.lua")
if err != nil {
fmt.Print(err.Error())
return
}
err = L.CallByParam(lua.P{
Fn: L.GetGlobal("add"),
NRet: 1,
Protect: true,
}, lua.LNumber(1), lua.LNumber(2))
if err != nil {
fmt.Print(err.Error())
return
}
ret := L.Get(-1)
// 如果是2个返回值, NRet改为2
// ret2 := L.Get(2)
// L.Pop(2)
L.Pop(1)
res, ok := ret.(lua.LNumber)
if ok {
fmt.Println(res)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Lua调用Go的函数
Lua调用Go语言的函数就没那么常用,因为虚拟机在Go语言程序里,需要传递数据直接通过Go的SetGlobal或函数调用就可以了。

不过仍然有一种应用场景需要Lua调用Go语言的函数,例如数据处理过程中,需要发送一个异步HTTP请求,或者把数据插入到MySQL或者Redis,就可以调用Go的HTTP请求函数或数据库处理函数。

Lua
print(add(10,20))
1
Go
package main

import (
"fmt"

lua "github.com/yuin/gopher-lua"
)

func Add(L *lua.LState) int {
// 获取参数
arg1 := L.ToInt(1)
arg2 := L.ToInt(2)

ret := arg1 + arg2

// 返回值
L.Push(lua.LNumber(ret))
// 返回值的个数
return 1
}

func main() {
L := lua.NewState()
defer L.Close()

// 注册全局函数
L.SetGlobal("add", L.NewFunction(Add))

// go
err := L.DoFile("main.lua")
if err != nil {
fmt.Print(err.Error())
return
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
LuaTable转为GoStruct
package main

import (
"fmt"

"github.com/yuin/gluamapper"
lua "github.com/yuin/gopher-lua"
)

func main() {
type Role struct {
Name string
}

type Person struct {
Name string
Age int
WorkPlace string
Role []*Role
}

L := lua.NewState()
if err := L.DoString(`
person = {
name = "Michel",
age = "31", -- weakly input
work_place = "San Jose",
role = {
{
name = "Administrator"
},
{
name = "Operator"
}
}
}
`); err != nil {
panic(err)
}
var person Person
if err := gluamapper.Map(L.GetGlobal("person").(*lua.LTable), &person); err != nil {
panic(err)
}
fmt.Printf("%s %d", person.Name, person.Age)
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/xuehu96/article/details/126613678

标签:调用,err,lua,gopher,Lua,Go,main
From: https://www.cnblogs.com/ExMan/p/18023867

相关文章

  • hello_lua
    https://github.com/norman/hello-luahello_lua2libnativefunc.c#include<lua.h>#include<lauxlib.h>staticintl_mult50(lua_State*L){doublenumber=luaL_checknumber(L,1);lua_pushnumber(L,number*50);return1;}intluaopen......
  • OpenResty 介绍与实战讲解(nginx&lua)
    目录一、概述二、OpenResty安装三、OpenResty的工作原理四、OpenResty核心模块1)ngx_lua模块2)ngx_stream_lua模块3)ngx_http_lua_module模块4)ngx_http_headers_more模块5)ngx_http_echo模块6)ngx_http_lua_upstream模块7)ngx_http_redis模块8)ngx_http_proxy_connect_module......
  • Redis使用Lua脚本
    Redis使用Lua脚本Redis使用lua脚本的优点减少网络开销:将原来多次请求的逻辑封装为脚本在服务器上执行,只需1次请求就能完成,减少了网络往返时延;原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入;复用性:客户端发送的脚本会永久保存在Redis中,其他客户端可以复用......
  • less报错,Error evaluating function `unit`: the first argument to unit must be a n
    1、less-loader版本太高了,可以降低版本2、lessc的执行参数里面增加一个参数--math=always3、可以关闭严格模式{loader:"less-loader",options:{lessOptions:{strictMath:false,},},}, 4、vite配置可以设置math:"always",......
  • How to evaluate the Messi Hong Kong fraud incident?
    WhoisLionelMessi?URL:https://en.wikipedia.org/wiki/Lionel_MessiAsafamousfootballplayer,Messiplaysacrucialroleinsociety,andhisconductshouldadheretobothmoralandlegalstandards.Fraudulentbehaviornotonlytarnisheshispe......
  • Spring Boot + Lua = 王炸!
    曾经有一位魔术师,他擅长将SpringBoot和Redis这两个强大的工具结合成一种令人惊叹的组合。他的魔法武器是Redis的Lua脚本。今天,我们将揭开这个魔术师的秘密,探讨如何在SpringBoot项目中使用Lua脚本,以解锁新的可能性和提高性能。如果你一直在寻找提升你的应用程序的方法,那么这篇博......
  • 在Unity中快速生成基于模板的Lua脚本
    在学习Xlua时,这个工具提供了一个简单而强大的方式来快速生成基于模板的Lua脚本,有助于提高开发效率和保持代码的一致性。1.xlua框架导入在GitHub上搜索xlua,找到腾讯的xlua项目,下载项目的压缩包。然后将压缩包里的Plugins和XLua这两个文件夹导入Unity的Assets目录下,如下图所示:2.......
  • lua 语法介绍与 NGINX lua 高级用法实战操作
    目录一、概述二、lua安装三、lua语法1)lua数据类型2)lua变量3)lua拼接字符串4)lua循环5)lua函数6)lua条件控制7)lua库模块四、NGINXlua高级用法一、概述lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活......
  • AWR1243+DCA100——数据读取(基于mmWave Studio LUA和MATLAB)
    参考文献:[1]扬帆起航:毫米波雷达开发手册之硬件配置[2]使用LUA脚本,通过Matlab控制mmWaveStudio,一键实现DCA1000参数配置和雷达数据采集文献[1]详细介绍了利用mmWaveStudio的lua语言,基于Matlab对雷达板AWR1243进行参数配置和回波数据读取的解决方案,文献[2]是对文献[1]的增补......
  • Evaluation Of postfix Expression using stack【1月21日学习笔记】
    点击查看代码//EvaluationOfpostfixExpressionusingstack#include<iostream>#include<stack>//stackfromstandardtemplatelibrary(STL)#include<string>usingnamespacestd;intEvaluatePostfix(stringexp);boolIsOperator(charc);intPe......