将Go函数导入Lua中供lua调用

本文介绍如何在Lua中调用Go语言实现的功能。通过利用Go可以嵌入C语言的特性,使用lua中的full userdata将Go函数封装成可调用的对象。通过设置metatable的__call元方法,实现从Lua调用Go函数的桥梁。在Go中定义结构并记录函数序号,然后在C代码中注册Go函数,创建userdata并设置metatable,最终在Lua调用时由C代码转发到Go函数执行。
摘要由CSDN通过智能技术生成

有一个需求,就是使用go语言来实现一些基本模块,使用lua来实现基本逻辑,于是就有了在lua中调用go函数的需求。

go的资料非常少,好在go可以嵌入c语言,使得这个实现变得有可行性。最终使用了lua中的full userdata来实现这个东西。将go中的函数全部封装成userdata,供lua调用。这样是可行的,由于userdata可以设置metatable,metatable内可以设置一个原方法__call,那么如下的调用:

func(1, 3) 

就可以变成

func.metatable.__call(func, 1, 3)

我们只要在c中实现这么一个元方法,装入特定的metatable中,将此metatable设为函数userdata的metatable,那么就可以实现这个需求了。

在lua脚本中的所有调用,均会调用到go中的c代码部分,在c函数中,将此userdata解析,确定到某个go函数,那么在go中再调用go语言部分,那么lua-》go的桥梁就已经打通了。

那么,我们可以在go中定义一个结构

type LuaGo_State struct {
    ....BasePart
    gofunctions map[int]interface{}
    baseSeq int
}

在BasePart中应该已经实现了lua的一些基本操作,比如创建什么的,我就不贴了。baseSeq是导出的gofunction的序号,用于回调时确定回调的go函数。gofunctions则记录着某个序号对应的gofunction。

然后,我们需要在lua_state中记录该

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值