Lua代码嵌入Golang

Go版本:1.19
首先是Go语言直接调用Lua程序,并打印,把环境跑通

package mainimport lua "github.com/yuin/gopher-lua"func main() {L := lua.NewState()defer L.Close()// goerr := L.DoString(`print("go go go!")`)if err != nil {return}
}

Lua的stdout可以直接转到go的stdout里,不过只调用打印一下没用意义,最重要的是函数调用

Go调用Lua的函数

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

  • Lua代码
function add(a,b)return a+b
end

Lua支持多个参数和多个返回值,参数好办,用lua.LNumber(123)

类型有:

  • LTNil
  • LTBool
  • LTNumber
  • LTString
  • LTFunction
  • LTUserData
  • LTThread
  • LTTable
  • LTChannel

返回值个数也可以是多个,调用CallByParam的时候,NRet就是返回参数个数,Fn是要调用的全局函数名,Protecttrue时,如果没找到函数或者出错不会panic,只会返回err。

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

  • Go代码
package mainimport ("fmt"lua "github.com/yuin/gopher-lua"
)func main() {L := lua.NewState()defer L.Close()// goerr := 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)}
}

Lua调用Go的函数

Lua调用Go语言的函数就没那么常用,因为虚拟机在Go语言程序里,需要传递数据直接通过Go的SetGlobal或函数调用就可以了。

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

  • Lua
print(add(10,20))
  • Go
package mainimport ("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))// goerr := L.DoFile("main.lua")if err != nil {fmt.Print(err.Error())return}
}

LuaTable转为GoStruct

package mainimport ("fmt""github.com/yuin/gluamapper"lua "github.com/yuin/gopher-lua"
)func main() {type Role struct {Name string}type Person struct {Name      stringAge       intWorkPlace stringRole      []*Role}L := lua.NewState()if err := L.DoString(`person = {name = "Michel",age  = "31", -- weakly inputwork_place = "San Jose",role = {{name = "Administrator"},{name = "Operator"}}}
`); err != nil {panic(err)}var person Personif err := gluamapper.Map(L.GetGlobal("person").(*lua.LTable), &person); err != nil {panic(err)}fmt.Printf("%s %d", person.Name, person.Age)
}

【Go-Lua】Golang嵌入Lua代码——gopher-lua相关推荐

  1. lua怎么嵌入php,Lua教程(一):在C++中嵌入Lua脚本

    本系列教程主要介绍如何在C/C++程序里面嵌入Lua脚本,我打算从以下几个方面来介绍: 1.如何在C/C++里面嵌入Lua脚本 2.Lua访问C/C++数据结构(这里面要介绍类,结构体,函数,变量,枚 ...

  2. Lua基础学习--附代码,运行截图

    Lua基础学习 一.lua简介 Lua [1] 是一个小巧的脚本语言.它是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里 ...

  3. 一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp)...

    一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp) 程序员的生活要一切自动化,更要幸福^_^. 转载请注明出处http: ...

  4. 【代码学习】lua+redis分布式锁代码实现实例

    文章目录 分布式锁场景和介绍: 分布式锁模板类: 锁实现类 lua脚本加锁和解锁 分布式速度限制 测试分布式锁 分布式锁场景和介绍: 分布式锁演进-基本原理 分布式锁演进-阶段一 分布式锁演进-阶段二 ...

  5. (转)一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp)...

    转自:http://www.cnblogs.com/mrblue/p/3885043.html 一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码 ...

  6. lua怎么嵌入php,Linux下安装PHP的lua扩展库

    一.安装Lua 5.3.4 下载 http://www.lua.org/ftp/lua-5.3.4.tar.gz tar xvf lua-5.3.4.tar.gz cd lua-5.3.4 重要:进入 ...

  7. linux lua ide,mac os上开发lua用什么ide

    2016-09-22 回答 一.mac os x中make和gcc命令的安装 在编译lua前需要做的准备工作. 我将lua-5.2.2.tar.gz下载到苹果电脑中,解压后进行编译时,发现我的mac ...

  8. Lua源码分析 - 基础篇 - Lua源码的结构和架构图(01)

    目录 一.Lua语言简介 二.Lua架构图 三.Lua源码结构 很久很久没有写博客了,一直忙于工作和项目,最近依然想静下来阅读一些好的源码.自从读完了Nginx和Memcache的源码后,对服务器端的 ...

  9. Go语言和php个和lua,当 Go 遇上了 Lua

    在 GitHub 玩耍时,偶然发现了 gopher-lua ,这是一个纯 Golang 实现的 Lua 虚拟机.我们知道 Golang 是静态语言,而 Lua 是动态语言,Golang 的性能和效率各 ...

最新文章

  1. 艾伟也谈项目管理,说说我们项目组的考核
  2. BootStrap网格布局
  3. java封装弊端_JAVA-初步认识-第十三章-同步的好处和弊端
  4. ubutun 更换网络源_「ubuntu脚本1」开启ssh替换第三方源开启tab键补齐屏蔽nouveau
  5. PHP制作订货,PHP生成订单号的两种方法
  6. webservice之helloword(web)rs
  7. 以后可得记住了--Python笔试面试题小结
  8. 列表显示新闻等信息,添加新消息图标
  9. java 学习笔记之AtomicInteger类的使用
  10. 寒冬已至,传统零售业如何打破僵局“逆境生长”
  11. 华为延期,三星下架,讲讲折叠屏为什么这么难
  12. mcgs 安装没有权限_我的电脑为什么不能安装mcgs组态软件
  13. 死亡之ping(Ping of Death)
  14. 读取头部姿态数据集300W_LP、AFLW2000、BIWI数据集中的真值
  15. 基于STM32的医院呼叫系统设计
  16. 利用AOP+Swagger注解实现日志记录功能
  17. mysql开机启动_MySQL开机自动启动的设置方法
  18. 商誉风险只是局部爆发 市场整体业绩没那么糟
  19. python百万邮件群发软件_用python来群发邮件的程序代码
  20. Java+spring+springmvc 基于ssm的超市进销存管理系统#毕业设计

热门文章

  1. TUV南德与重庆赛宝于四川签署合作协议并联合举办多国认证研讨会
  2. cf103202M. United in Stormwind
  3. pcs与crmsh命令比较
  4. python 统计文本字数 生成词云图
  5. 前端和后端是如何实现交互的
  6. 离谱的布斯法(补码一位乘)
  7. AAC(高级音频编码)帧格式及编码介绍
  8. Linux(日志管理)
  9. Ant学习笔记(Ant入门)
  10. mysqlbinlog恢复mysql表数据