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

news/2024/4/29 10:46:36/文章来源:https://blog.csdn.net/xuehu96/article/details/126613678

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)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_3471.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebRTC系列-SDP之setLocalDescription(2)

文章目录 1. setLocalDescription整体流程总结2.几个channel的含义3. 音频流水线的建立3.1 signal线程流程3.2 work线程流程在上一章从源码的角度分析了WebRTC的setLocalDescription的代码调用流程及相关函数,这一章从一张图总结其核心函数调用;同时多上篇遗留的多个channal关…

第03章 SpringBoot 配置详解

序言 1.内容介绍 ​ 本章介绍了配置文件的作用、语法结构以及基于多种方式进行配置文件的配置实现,同时对于SpringBoot如何集成logback日志框架进行日志的写入进行了详细的实战演示。 2.知识目标 掌握系统配置文件的结构掌握系统配置文件、自定义配置文件的作用…

神经网络相关性系数r公式,神经网络预测数据

MATLAB神经网络训练图中R是什么 谷歌人工智能写作项目:神经网络伪原创 相关系数r的计算公式是什么? 相关系数介于区间[-1,1]好文案。当相关系数为-1,表示完全负相关,表明两项资产的收益率变化方向和变化幅度容完全相…

QML初学者教程

QML初学者教程 使用 QML、Qt 5、JavaScript 和 C 在 windows、mac 和 linux 上进行跨平台 GUI 应用程序开发 课程英文名:qml-for-beginners 此视频教程共5.0小时,中英双语字幕,画质清晰无水印,源码附件全 下载地址 百度网盘地…

Windows与网络基础-3-虚拟机安装Kali Linux

目录 一、虚拟机软件和ios镜像文件 二、Kali Linux安装 2.1 文件—>新建虚拟机 2.2 选择典型安装 2.3 选择稍后安装 2.4 选择操作系统类型和版本 2.5 虚拟机命名和安装路径选择 2.6 选择磁盘大小 2.7 自定义硬件配置 三、进入系统,安装带图形化界面 四…

毕业那年的大学生创新立项

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成…

面试题-谈谈你对JVM的理解

首先问一个问题,jvm、jdk、jre三者的区别?再去谈其他的 JVM(Java Virtual Machine):虚拟机 ,源文件.java在虚拟机中通过编译器编译成字节码文件.class,是整个java实现跨平台的最核心的部分 操作…

什么是快应用?与原生APP相比优势在哪里

目前,头部互联网企业以及手机厂商两大阵营,正打得不可开交。腾讯、阿里、百度、今日头条等头部互联网企业,齐齐发力小程序,借助于开发者的力量,来强大自身的服务能力,提高超级平台的粘性,深挖存…

vue路由原理

前端路由切换原理:本质就是监听url的变化,然后匹配路由规则,显示相应的页面,并且不刷新页面。目前单页面应用实现路由的方式只有俩种: hash模式 history模式 hash模式相当于瞄点跳转。监听url#后面的传值发生变化&…

idea常用快捷键和插件

快捷键 查看父子关系图:ctrlaltu 全局搜索ctrlshirtF 全局替换:CtrlshirtR 插件 汉化Chinese 配置文件yml转properties 代码预览插件: MyBatis增强插件:MybatisX 快速定位接口工具(RestfulToolkit-fix) 安装之后使用快捷键"Ctrl\"或"CtrlAltN"调出搜…

Leetcode 946.验证栈序列

1.题目描述 给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。 输入:pushed [1,2,3,4,5…

基于数字孪生的智慧城市是如何发展的?

数字孪生是指充分利用物理模型、传感器更新、运行历史等数据,集成多学科、多尺度、多概率的仿真过程,在虚拟空间中完成映射,从而反映相对应的实体装备的全生命周期过程。简而言之,数字孪生就是在一个设备或系统的基础上创造一个克…

零基础学Java有哪些必看书?推荐这5本

零基础学Java初学者,想要入门,应该多看一些关于Java的书,先充实理论基础。然而Java的技术知识是海量的,市面上关于Java的书令人眼花缭乱,零基础的小白完全不知道该看哪本书。那么,零基础学Java有哪些必看书…

阿里巴巴微服务核心手册:Spring Boot+Spring cloud+Dubbo

前言 微服务作为一项在云中部署应用和服务的新技术已成为当下最新的热门话题。但大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务,而红帽说 API 应该是重点。 企业和服务提供商正在寻找更好的方法将应用程序部署在云环境中,微服务…

opencv-python之位平面分解与数字水印

位平面分解与数字水印位平面分解与数字水印位平面分解1.图像预处理2.构造提取矩阵3.位平面提取4.阈值处理5.显示图像简单的数字水印1.载体图像预处理2.水印图像处理3.水印添加4.水印提取位平面分解与数字水印 两张素材: 位平面分解 图像矩阵中的每个值是一个八位二进制数&…

技术分享 | 黑盒测试方法论—等价类

等价类划分是一种重要的、常用的黑盒测试方法,不需要考虑程序的内部结构,只需要考虑程序的输入规格。它将不能穷举的测试过程进行合理分类,从而保证设计出来的测试用例具有完整性和代表性。需要把用户所有可能输入的数据,划分成若…

JAVA----钉钉机器人消息样式,关于PC 端与手机端文字消息样式显示不统一

关于PC 端与手机端文字消息样式显示不统一 颜色 String message "<font color#e60020>" 欢迎您加入公司&#xff01; "</font>";不加引号 或 加双引号String message "<font color\"#e60020\">" 欢迎您加入公…

新课标、新考法,猿辅导创新教育研究院全面拆解新课标

“义务教育课程方案和课程标准&#xff08;2022 年版&#xff09;”&#xff0c;也就是众多周知的“新课标”已于今年4月正式颁布。近日&#xff0c;各地的2022秋季学期已陆续开学&#xff0c;这版新修订的义务教育课程也将进入实施阶段。那么&#xff0c;这版新课标究竟有哪些…

RocketMQ的架构设计

目录 1 、技术架构 2、部署架构 2.1、RocketMQ 网络部署特点 2.2、结合部署架构图&#xff0c;描述集群工作流程&#xff1a; 1 、技术架构 RocketMQ架构上主要分为四部分&#xff0c;如上图所示: Producer&#xff1a;消息发布的角色&#xff0c;支持分布式集群方式部署。…

图神经网络(三):数学基础

一.复数空间 在实数空间中&#xff0c;加法、减法可以看成是沿数轴的左右平移&#xff0c;乘法、除法可以看成是沿数轴的拉伸和压缩。但是在现实生活中除了平移和缩放以外&#xff0c;还存在旋转。在复数发明之前&#xff0c;处理旋转问题是非常麻烦的。 1.复数的定义 i2i^2i…