gopher-lua

lua_call

golang和lua交互的方式与c++和lua交互的方式一样,都是通过一个栈,详细请看这里:https://blog.csdn.net/u012278016/article/details/79471738

Call函数介绍

func (ls *LState) Call(nargs, nret int)
nargsnret

使用方法

在使用之前需要先将lua中的函数压入栈,之后再将需要的参数压入,就可以调用call函数。

Lua代码:

function say( ... )
	-- body
	print("This is line.")
end

function add( index1, index2 )
	-- body
	ret1 = index1 + index2
	re2 = inedex1 - index2
	return re1, re2
end

Go代码:

package main

import (
	"fmt"
	"reflect"
)

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

func main() {


	L := lua.NewState()
	L.DoFile("mylua.lua")
	f := L.GetGlobal("say")
	L.Push(f)
	L.Call(0,0)

	value := L.GetTop()
	fmt.Println(L.Get(value))  //因为say函数没有返回值,所以这里是nil


	f = L.GetGlobal("add")  //这里函数有输入值,需要先将函数压入栈,再压入参数
	L.Push(f)
	L.Push(lua.LNumber(2))
	L.Push(lua.LNumber(2))
	L.Call(2,2)。          
	/*参数的返回值会依次压入栈,ret1先压入
	ret2后压入,所以执行后栈顶的是ret2,接下来的才是ret1*/

	value = L.GetTop()
	fmt.Println(L.Get(value))  // ret2:0
	L.Pop(1)
	value = L.GetTop()
	fmt.Println(L.Get(value))  //re1:4


}

结果:

This is line.
nil
0
4